c++ allrounder gefragt(Dateiverwaltung / Umgebungsvariablen)

d0x

Cadet
Mitglied seit
14.05.2005
Beiträge
30
Renomée
0
hi,
hab ein paar Probleme die ich nicht zu lösen weiss. Also geht um folgendes.

Ich hätte gerne ein paar infos aus der regedit ausgelesen. Würde die ausserdem gerne durchsuchen. z.b. nach der ICQ version oder sonst irgendwas. Hat einer ne idee wie ich in die registry reinkomm? Denke mal das suchverfahren kann ich dann noch selber schreiben(jenachdem wie das handling von der lösung dann ist).

Ich würde auch noch gerne die Festplatte durchsuchen. Und zwar nach einem dateinamen. Ich weiss wie ich dateien öffne und verarbeite, aber leide muss ich da immer den pfad angeben. Hätte gerne ein programm, das mir alle blah.txt auf der festplatte sucht und den pfad in einen string schreibt (oder in verschiedene strings). Ich hab leide keine ahnung wie ich die verzeichnisse durchsuchen kann.

Als letztes würde ich gerne den Anmeldename (bei xp) rausbekommen. Habe mir schon die umgebungsvariablen angeschaut aber da gibts keine die den benutzernamen enthalten. höchstens in %temp% da steht er im pfad, allerdings weiss ich auch nciht wie ich %temp% in einen c++ string speicher.

Danke schonmal an alle.
gruss d0x
 
d0x schrieb:
aus diesem Posting

Ich hätte gerne ein paar infos aus der regedit ausgelesen.
Du meinst die Registry. Regedit ist nur ein Editor für eben jene.;)
d0x schrieb:
aus diesem Posting

Würde die ausserdem gerne durchsuchen. z.b. nach der ICQ version oder sonst irgendwas. Hat einer ne idee wie ich in die registry reinkomm? Denke mal das suchverfahren kann ich dann noch selber schreiben(jenachdem wie das handling von der lösung dann ist).
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/registry_functions.asp
-> RegOpenKeyEx, RegEnumKeyEx, RegEnumValue, RegCloseKey...
d0x schrieb:
aus diesem Posting

Ich würde auch noch gerne die Festplatte durchsuchen. Und zwar nach einem dateinamen. Ich weiss wie ich dateien öffne und verarbeite, aber leide muss ich da immer den pfad angeben. Hätte gerne ein programm, das mir alle blah.txt auf der festplatte sucht und den pfad in einen string schreibt (oder in verschiedene strings). Ich hab leide keine ahnung wie ich die verzeichnisse durchsuchen kann.
http://msdn.microsoft.com/library/d...en-us/fileio/fs/file_management_functions.asp
-> FindFirstFile, FindNextFile, FindCloseFile...
d0x schrieb:
aus diesem Posting

Als letztes würde ich gerne den Anmeldename (bei xp) rausbekommen. Habe mir schon die umgebungsvariablen angeschaut aber da gibts keine die den benutzernamen enthalten. höchstens in %temp% da steht er im pfad, allerdings weiss ich auch nciht wie ich %temp% in einen c++ string speicher.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getusername.asp
 
Und genau wegen solchen antworten liebe ich dieses forum.

Danke :)

ich guck mal was ich damit anfangen kann.

gruß d0x
 
ok, hat so alles geklappt.

Kann mir mal bitte noch einer sagen wie eine datei von einer hompepage geladen bekomme (z.b. http://d0x.gmxhom.de/test.exe ) .

also ich hatte mir überlegt eine verbindung zur homepage über sockets aufzubauen und mir sie dann mit dem get befehel byteweise zu saugen und gleichzeitg jedes byte zu speichern. Problem ist nur, das ich nicht verstellen kann wielang der byts empfangen muss. Ich hatte erst gedacht das ich das empfangene byte auf das zeichen \eof prüfe, leider ohne erfolg. Ich glaub es steht ja auch nicht bei jeder datei \eof am ende oder? Und die zeit wenn man was byteweise empfängt ist auch zu lange

Also bisher kann ich für dieses problem zu lösen sockets aufbauen, dateien binär speichern (fstream.h).

Danke im vorraus,
d0x
 
http://msdn.microsoft.com/library/d...y/en-us/wininet/wininet/wininet_functions.asp

-> Mit InternetOpenUrl oder HttpOpenRequest ein Handle auf die Datei erzeugen; mit InternetReadFile oder InternetReadFileEx die Datei runterladen; mit InternetCloseHandle das Handle freigeben.

Wichtig für InternetReadFile:
To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero.

HTH
TiKu
 
Kann es sein das die MSDN-Befehle alles können?

Welchen Editor benutzt ihr? Bzw. könnt ihr mir einen empfehlen mit dem ich auch komerzielle sachen schreiben kann, der ziemlich gut ist? Also das er so n debugger hat wieder der Borland C++ Builder wäre ganz gut. Und weis einer von euch wie das mit den Lizenzen mit dem Borland C++ Builder 5 ist. Mit hat einer gesagt das Borland die nicht mehr verwaltet und deswegen wäre das dann kostenlos. Borland selber hat nur ne englische hotline und dafür reicht mein englisch net aus.
 
d0x schrieb:
aus diesem Posting

Kann es sein das die MSDN-Befehle alles können?
MSDN-Befehle ist der falsche Begriff. Windows enthält ein Subsystem namens Win32, welches die Innereien des Betriebssystems kapselt und ein relativ stabiles (d. h. auf hohe Kompatibilität ausgelegtes) Interface (Application Programming Interface - API) bietet. Win32-API ist eigentlich der richtige Begriff.
Das MSDN (Microsoft Developer Network) ist eine Sammlung von Beispielen, Dokumentationen, Artikeln usw. über Windows, Office, DirectX, IE, IIS, Visual Studio, WMP usw., wobei es sich (wie der Name schon verrät) an Entwickler und nicht an Endanwender richtet. Teil des MSDN ist das Platform SDK, welches das Win32-Subsystem beleuchtet. Das Platform SDK enthält auch alles nötige um das Win32-API in eigenen C/C++-Anwendungen zu nutzen - sprich: Header-Dateien, Libraries, diverse Tools usw.

Für die allermeisten Anwendungen bietet das Win32-API (oder darauf basierende Bibliotheken) alles was man braucht. Lediglich sehr systemnahe Software wie Defragmentierer greift direkt auf das Kernel-API zurück.
d0x schrieb:
aus diesem Posting

Welchen Editor benutzt ihr? Bzw. könnt ihr mir einen empfehlen mit dem ich auch komerzielle sachen schreiben kann, der ziemlich gut ist? Also das er so n debugger hat wieder der Borland C++ Builder wäre ganz gut. Und weis einer von euch wie das mit den Lizenzen mit dem Borland C++ Builder 5 ist. Mit hat einer gesagt das Borland die nicht mehr verwaltet und deswegen wäre das dann kostenlos. Borland selber hat nur ne englische hotline und dafür reicht mein englisch net aus.
Ich nutze Visual Studio 2003, welches ich über die Uni kostenlos bekommen habe. Davor habe ich Visual Studio 6.0 genutzt, welches ich mir vor einigen Jahren gekauft hatte.
IMHO gibt es nichts besseres als Visual Studio 2003. Wenn es nur um .net geht, kann maximal #develop Corsavy halbwegs mithalten. Für C++ wird oft Dev-C++ empfohlen (einfach mal nach DevCpp googlen). Eclipse ist auch recht beliebt (ist eigentlich für Java, aber es gibt ein Plugin für C++).
 
Ich komme da mit den Funktionen nicht klar. Kannst du mir evtl einen beispielcode geben um die datei http://d0x.gmxhome.de/cc3250.dll runter zu downloaden. Ich blicke nicht ganz durch. Verstehe die beschreibung mit den datentypen net. LTPSTR und so ist für mich neu. Genau wie DWORD. Habs so noch nie genutzt. Bei den anderen funktionen konnte ich mir aus den Beispielcodes alles zusammenkopieren und im debugger nachvollziehen.
 
LPTSTR und DWORD sind Datentypen. DWORD ist ein Doppelwort, also eine 32Bit-Ganzzahl (auf 32Bit-Systemen), und zwar unsigned. LPTSTR ist ein Zeiger auf eine 0-terminierte Zeichenkette. Bei einem ANSI-Build ist diese Zeichenkette ein ANSI-String, bei einem Unicode-Build ein Unicode-String.

Ich habe die genannten API-Funktionen selbst noch nie genutzt, hab mich aber trotzdem mal an einem kleinen Programm versucht, welches anscheinend sogar funktioniert. *yeah*

Code:
// WebTest.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

// benötigt für STL
#include <iostream>
#include <conio.h>

// benötigt für _TCHAR
#include <tchar.h>
// benötigt für die Basis-Funktionen (u. a. WriteFile) des Win32-API
#include <windows.h>
// benötigt für die Internet*-Funktionen
#include <wininet.h>

// gegen die wininet.lib linken
#pragma comment(lib, "wininet.lib")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	cout << "Press any key to start download" << endl;
	getch();
	cout << "Please wait...";

	///////////////////////////////////////////////////////////////////
	// Session öffnen
	HINTERNET hInet = InternetOpen(_T("MyAppName"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if(hInet != NULL) {
		// Verbindung zum Server herstellen
		HINTERNET hRemoteFile = InternetOpenUrl(hInet, _T("http://d0x.gmxhome.de/cc3250.dll"), NULL, 0, INTERNET_FLAG_RELOAD, NULL);
		if(hRemoteFile != NULL) {
			// die lokale Datei erzeugen, in die wir schreiben werden
			HANDLE hLocalFile = CreateFile(_T("C:\\cc3250.dll"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
			if(hLocalFile != NULL) {
				// solange Daten verfügbar sind...
				DWORD numberOfBytesAvailable = 0;
				while(InternetQueryDataAvailable(hRemoteFile, &numberOfBytesAvailable, 0, 0)) {
					if(numberOfBytesAvailable > 0) {
						// ...allokiere einen Puffer...
						LPVOID pBuffer = malloc(numberOfBytesAvailable);

						// ...und fülle ihn mit den verfügbaren Daten
						DWORD numberOfBytesRead = 0;
						if(InternetReadFile(hRemoteFile, pBuffer, numberOfBytesAvailable, &numberOfBytesRead) == FALSE) {
							// TODO: Fehlerbehandlung
						}
						if(numberOfBytesRead != numberOfBytesAvailable) {
							// TODO: Fehlerbehandlung
						}
						// empfangene Daten in die lokale Datei schreiben
						DWORD numberOfBytesWritten = 0;
						if(WriteFile(hLocalFile, pBuffer, numberOfBytesRead, &numberOfBytesWritten, NULL) == FALSE) {
							// TODO: Fehlerbehandlung
						}
						if(numberOfBytesWritten != numberOfBytesRead) {
							// TODO: Fehlerbehandlung
						}

						// Puffer wieder freigeben
						free(pBuffer);
					} else {
						break;
					}
				}

				// das Handle freigeben
				CloseHandle(hLocalFile);
			}

			// das Handle freigeben
			InternetCloseHandle(hRemoteFile);
		}

		// das Handle freigeben
		InternetCloseHandle(hInet);
	}
	///////////////////////////////////////////////////////////////////

	cout << "Done." << endl;

	return 0;
}
Der Code weicht etwas von dem ab was ich anfangs gepostet hatte. Aber ich hab die Internet*-API-Funktionen heute wie gesagt das 1. Mal genutzt.
Das Makro _T() gibt einen LPTSTR-Zeiger auf den übergebenen String zurück. Falls Du sonst noch Fragen zum Code hast: frag ruhig. 8)
 
Ok danke. Werds mir nachher (in der pause) evtl mal genauer anschauen (sonst heute abend). Bin gerade auf der arbeit und hier wird nur RPG (ältere Programmiersprache für Warenwirtschaft) benutzt. Ist IBM gebunden, deswegen kennt man es kaum. ist ein Wort nicht immer
 
Zurück
Oben Unten