WIN32_FIND_DATA

03/29/2016 07:29 Halfbax#1
Guten morgen,

ich habe mich versuch zu informieren, aber bisher konnte ich keine Lösung zu meinem Problem erarbeiten. Grob gesagt, ich kriege eine sehr komische Ausgabe.

Fangen direkt mit dem Code an.
Code:
std::string fullPath = path + "/S4 Bot/Log/";
std::string fileName[256];

HANDLE myHandle;
WIN32_FIND_DATA findData;
myHandle = FindFirstFile((LPCWSTR)(fullPath + "*.log").c_str(), &findData);
do {
	if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
		cout << "Directoryname is " << findData.cFileName << endl;
	}
	else {
		std::cout << "Filename is " << *findData.cFileName << std::endl;
	}
} while (FindNextFile(myHandle, &findData));
Meine Ausgabe ist ohne die Dereferenzierung: Filename is 004FDB48.
Wenn du es nun deferenziere, folgt diese Ausgabe: Filename is 52428.

Ich weiß, leider nicht mehr weiter. Mir wurde vorgeschlagen, das Ganze als wchar handzuhaben, aber das hat leider auch keinen Erfolg gegeben, aber vielleicht lag das auch nur an meine herangehensweise.

Mit freundlichen Grüßen,
Halfbax
03/29/2016 09:55 Jeoni#2
Ja, generell solltest du die Unterscheidung zwischen Widechar (wie auch immer du es nennen willst) und Ascii machen. Sowohl der normale std::string, wie auch das std::cout sind ausschließlich Ascii. Heißt ein Byte pro Zeichen. Widechar bedeutet zwei Byte pro Zeichen (damit lassen sich dann natürlich auch exotischere Zeichen darstellen).
Das
Code:
(LPCWSTR)(fullPath + "*.log").c_str()
und
Code:
cout << "Directoryname is " << findData.cFileName << endl;
recht sinnlos sind, sollte eigentlich klar sein (Mix von Ascii und Widechar). Und was das Dereferenzieren soll, ist mir auch nicht ganz klar. Dass dort aber 0xCCCC rauskommt, wundert mich nicht. Ich vermute, dass schon FindFirstFile fehlgeschlagen ist (weil halt das erste Argument Müll ist), aber da gibt es ja keinen Check, der das abfängt. Der cFileName-Member der Struktur ist mit der Projektkonfiguration bzw. den benutzten Defines ebenfalls Widechar, da die entsprechenden W-Strukturen aus Windows benutzt werden statt die A-Strukturen.
Möglichkeiten:
1) Alles Widechar. Statt std::string dann std::wstring und statt std::cout dann std::wcout nutzen. Weiterhin, wie aktuell auch, die Widechar-Funktionen der Winapi nutzen.
2) Alles Ascii. std::string und std::cout bleiben und entweder du stellst in den Projekteinstellungen irgendwo von "Unicode" auf "Multibyte" oder benutzt ganz explizit die A-Versionen der Funktionen und Strukturen (FindFirstFileA, WIN32_FIND_DATAA, etc.).
Mit freundlichen Grüßen
Jeoni
03/29/2016 11:29 Halfbax#3
Durch das Changen auf die A Funktionen, hat das Ganze geklappt :). Hatte daran garnicht gedacht, auf den Kopf des Ganzen zu achten. Ich bin manchmal echt ein dulli.

Ich danke und schönen dir einen schönen Tag.

Liebe Grüße,
Halfbax
03/29/2016 19:28 +Yazzn#4
std::tr2::sys aus dem <filesystem> header pls