Google에서 정보를 찾으려고했지만 Google에서 완전히 실패했습니다. 다음 코드는 표준 유니 코드로 컴파일 할 수 없으며 MessageBoxW에서 오류가 발생합니다. MessageBoxW가 손상되어 ollydbg에서 exe 파일을 분해하고 테스트했습니다. 그러나 내 사용자 이름 인 "юзер"는 메시지에서 예상대로 올바르게 표시됩니다). 문제는 C 컴파일러, 어떤 이유로 내 문자열을 올바르게 컴파일하지 못했습니다. 나는 L과 TEXT()를 같은 결과로 시도했다.Visual C++ unicode strings가 손상되었습니다.
이 파일은 BOM이없는 UTF-8로 인코딩 된 유일한 입력 파일입니다 (notepad ++).
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
그것은 절대적이다 :
#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);
}
빌드 명령 (I 원시 결과를 얻을 수 cmd.exe를에 수동 컴파일로 전환, 비주얼 스튜디오 2003 및 Visual C++ 6 건물을 시도했지만 오래 전에 포기했다) 아니 사용, 내가 시도한 모든 메서드는 소스 코드에서 정적 문자열을 손상 시키지만 내부 처리 (예 : winapi에서 얻은 것들은 신뢰할 수 있으며 정상적으로 작동합니다.)는 괜찮습니다. 나는 물론, 수작업으로 몇 줄을 작곡 할 수는 있지만, 운 좋게도 나는 많지 않지만 이상하게 들리지는 않습니까?
내가 여기에서 분명한 것은 무엇입니까?
나는 10 년 넘게 컴파일러 사용을 중단 할 것을 제안합니다. 최신 버전의 Visual Studio에서는 해당 코드를 컴파일하고 실행합니다. –
질문을 분명히해야합니다. 먼저 코드가 "컴파일 할 수 없다"고 말합니다. 그런 다음 컴파일 할 때 실행될 때 잘못된 출력을 제공한다고 알려줍니다. 또한 코드를 관련 부분 인 스트링 리터럴로 옮겨야하고 오해의 소지가있는 exe/GetModuleFileName을 제거해야합니다. –
@James : 죄송 합니다만, 컴파일러가 과거에 유니 코드와 정확히 어떻게 작동 했나요? 나는 최신 버전을 지금 다운로드하고있다. 그러나 그것은 이상하다. – einclude