私は情報を見つけようとしていましたが、Googleは完全に失敗しました。次のコードは標準のユニコードにコンパイルできず、MessageBoxW (MessageBoxW です。ollydbg で exe を逆アセンブルしてテストしました) で破損したものを取得しますが、exe へのパスからのユーザー名 "юзер" がメッセージに正しく表示されます (予想どおり)。 )。問題は C コンパイラです。何らかの理由で文字列を正しくコンパイルできません。L と TEXT() の両方を試してみましたが、結果は同じでした。
これは、BOM なしの UTF-8 (notepad++) としてエンコードされた、入力時の唯一のソース ファイルです。
#define _UNICODE
#define UNICODE
#include <windows.h>
void main() {
wchar_t exe[254];
GetModuleFileName(NULL,(wchar_t *)&exe,254);
MessageBox(NULL,(wchar_t *)&exe,L"юзер",0);
ExitProcess(0);
}
ビルド コマンド (Visual Studio 2003 と Visual C++ 6 でビルドしようとしましたが、ずっと前にあきらめ、cmd.exe での手動コンパイルに切り替えて生の結果を取得しました):
cl.exe /c /nologo test-unicode-ui.c link.exe /nologo /nodefaultlib /entry:main kernel32.lib user32.lib /OUT:test-unicode-ui.exe test-unicode-ui.obj
私が試したすべての方法で、ソースコードから破損した静的文字列が返されましたが、内部処理では問題ありません (たとえば、winapi から取得したものは信頼されており、正常に動作します)。もちろん、実行時にいくつかの文字列を手動で作成することもできます。幸運なことに、多くの文字列を作成することはできませんが、それは奇妙に聞こえませんか?
私がここに欠けていることは明らかですか?