2012-03-26 3 views
1

Dieser Code unten funktioniert nicht richtig, da mein MFC-Programm in Unicode-Umgebung ist.Wie mache ich :: WriteFile Arbeit in UNICODE Umstand?

::WriteFile(hFile, TEXT("123456"), lstrlenW(TEXT("123456")), &dwByte, nullptr); 
::CloseHandle(hFile); 

Das Ergebnis ist "123", die "123456"

Ich fand im Internet sein sollte, die Unicode-BOM diese lösen könnte. Also habe ich meinen Code geändert, um so weiter unten zu gehen.

WORD Unicode = 0xfeff; // UNICODE BOM 
::WriteFile(hFile, &Unicode, 2, &dwByte, nullptr); 
::WriteFile(hFile, TEXT("123456"), lstrlenW(TEXT("123456")), &dwByte, nullptr); 
::CloseHandle(hFile); 

Es macht jedoch keinen Unterschied.

Scheint wie es ist ein einfaches Problem, aber ich bin verloren auf der Suche nach der Lösung für diese.

Jede Idee wäre mehr als willkommen. Danke im Voraus.

Antwort

4

Writefile schreibt nicht "Text": es schreibt "Bytes". Die lstrlenW gibt die Nummer wchar_t zurück. Sie shold von sizeof(wchar_t) multiplizieren, um die mit dem dritten Parameter zu geben „ Anzahl von Bytes zu schreiben“

+0

ich dies zu schätzen wissen. Vielen Dank. –

+0

'TEXT()' arbeitet mit 'char' oder' wchar_t', abhängig davon, ob UNICODE definiert ist, aber 'lstrlenW()' nur für 'wchar_t' gilt. Wenn der Code in beiden Umgebungen arbeiten soll, verwenden Sie stattdessen 'lstrlen()' und 'sizeof (TCHAR)', zB: 'WriteFile (hFile, TEXT (" 123456 "), lstrlen (TEXT (" 123456 ")) * sizeof (TCHAR), ...) ' –

+0

@RemyLebeau - Richtig wieder ... netter! –

2

Sie möchten lstrlenW nicht verwenden, um die zu schreibende Datenmenge zu ermitteln. Sie müssen WriteFile die Anzahl der zu schreibenden Bytes mitteilen, nicht die Anzahl der Codepunkte. Jetzt sagst du es 6, das sind genug Bytes für 3 Zeichen.

+0

Vielen Dank –