Was ist die empfohlene Methode zum Iterieren über alle Dateien in einem geöffneten Dateidialog OFN_ALLOWMULTISELECT
mit Unicode aktiviert?Iterieren über alle Dateien in OFN_ALLOWMULTISELECT mit Unicode
Meine erste Idee war so etwas wie dieses:
TCHAR *tmp = ofn.lpStrFile + ofn.nFileOffset;
while(*tmp) {
wprintf("Got file: %s\n", tmp);
tmp += wcslen(tmp) + 1;
}
Aber dann fiel mir ein, dass dies dort nicht in Fall funktioniert Zeichen im String-Puffer sind, die in 16 Bits dargestellt wird, kann nicht sein. Für einen sicheren Ansatz müsste ich zuerst die Byte-Länge der TCHAR
Zeichenfolge herausfinden, dann den TCHAR
Zeiger auf char
umwandeln und diese Byte-Länge in jeder Iteration hinzufügen. Etwas wie folgt aus:
TCHAR *tmp = ofn.lpStrFile + ofn.nFileOffset;
while(*tmp) {
wprintf("Got file: %s\n", tmp);
tmp = (TCHAR *) (((char *) tmp)) + get_byte_len_of_tstr(tmp));
}
Beachten Sie, dass get_byte_len_of_tstr()
ist nur ein Platzhalter für eine Funktion, die für diesen Zweck geschrieben werden hätte. Da dieser Ansatz etwas ungeschickt aussieht, möchte ich zunächst nach Feedback fragen, ob das wirklich der richtige Weg ist oder ob ich etwas verpasst oder missverstanden habe ...
Sie haben kein echtes Problem, alle Zeichen können mit 16 Bit dargestellt werden. Einige brauchen nur zwei von ihnen, das wird deinen Code nicht stolpern. –
Aber AFAIU wcslen() gibt die Anzahl der Zeichen in einem TSTR zurück. Wenn also ein Zeichen 32 Bit im TSTR benötigt (dh zwei 16bit-Paare), gibt wcslen() immernoch 1 zurück, was meinen Zeiger durcheinander bringt Arithmetik in dem Code, den ich oben gepostet habe. – Andreas
Sie * müssen * dies wirklich versuchen, um zu sehen, dass dies nicht der Fall ist. wcslen() zählt wchar_t, keine Codepunkte. Wenn wchar_t zu einem Codepoint wird, der ein einzelnes Symbol auf dem Bildschirm darstellt, ist dies der Job des Textrenderers. Es wird ziemlich oft ein einzelnes Glyph aus zwei wchar_t erzeugen, selbst wenn sie nicht in den oberen Bitebenen sind. Passiert für akzentuierte Zeichen. –