Использование GetModuleFileName
правильно. Вы должны увидеть ожидаемый результат с MessageBoxW(0, filename, 0, 0);
Проблема в печати L"üлicä"
на консоли Windows.
Попробуйте напечатать "üлicä"
на консоли:
int main(int argc, char *argv[])
{
DWORD count;
std::wstring str = GetCommandLineW() + (std::wstring)L"\n";
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str.c_str(), str.size(), &count, 0);
MessageBoxW(0, str.c_str(), 0, 0);
wchar_t filename[MAX_PATH];
GetModuleFileNameW(0, filename, MAX_PATH);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), filename, wcslen(filename), &count, 0);
return 0;
}
В Visual Studio вы также можете использовать _setmode
, чтобы включить использование std::wcout/std::wcin
У вас также есть дополнительная точка входа wmain(int argc, wchar_t *argv[])
, которая обеспечивает argv
в кодировке UTF16.
Точка входа main
обеспечивает argv
в кодировке ANSI (не кодировке UTF8). ANSI может потерять информацию, в отличие от Unicode.