2016-11-20 1 views
-1

WinMain 또는 wWinMain을 사용할 때 ANSI 함수가 아닌 유니 코드 함수를 사용해야하는 경우를 알고 있습니까? 아니면 일반적인 제네릭 함수를 사용할 수 있습니까? 또한 WinMain 또는 wWinMain을 사용하면 함수에 사용되는 매개 변수의 유형에 영향을 미칩니 까? 빈 windoes를 생성하는 두 개의 서로 다른 튜토리얼에서 예를 들어 WinMain 및 wWinMain을 기반으로하는 유니 코드 및 ANSI 함수 및 매개 변수

MSDN에서 하나의 튜토리얼은 다음과 같이 지정

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 
{ 
    ...  
    // Create the window. 

    HWND hwnd = CreateWindowEx(
     0,        // Optional window styles. 
     CLASS_NAME,      // Window class 
     L"Learn to Program Windows", // Window text 
     WS_OVERLAPPEDWINDOW,   // Window style 

     // Size and position 
     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 

     NULL,  // Parent window  
     NULL,  // Menu 
     hInstance, // Instance handle 
     NULL  // Additional application data 
     ); 

다른 tutorial은 다음과 같이 지정하는 동안 :의 제목에

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
... 
    hwnd = CreateWindowEx(
     WS_EX_CLIENTEDGE, 
     g_szClassName, 
     "The title of my window", 
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, 
     NULL, NULL, hInstance, NULL); 

공지 사항 하나는 L "Title"을 사용하고 다른 하나는 "Title"을 사용하므로 WinMain의 유형에 따라 매개 변수 유형에도 영향을 미친다는 것을 알고 있습니다. 왜냐하면 wWinMain이 유니 코드에 사용되고 WinMain이 ANSI에 사용된다는 것을 알고 있기 때문입니다.

또한 wWinMain 또는 WinMain을 사용하고 있고 MessageBox와 같은 일반 함수를 사용하는 경우 다른 관련 질문으로 WinMain 유형에 따라 MessageBoxW 또는 MessageBoxA가 해결됩니까?

감사

+1

에 혼합 할 수 있습니다 * 차례로'UNICODE'과'_UNICODE를 정의 비주얼 스튜디오 (에 옵션 '매크로). –

+0

@JonathanPotter UNICODE와 _UNICODE의 차이점은 무엇입니까? –

+0

그냥 유산이라고 생각합니다. 어떤 것은 하나를 사용하고 어떤 것은 다른 것을 사용합니다. –

답변

2

WinMain()wWinMain() 프로그램이 ANSI 또는 유니 코드 여부로 실행 여부에 영향을주지 않습니다; 모든 것이 결정되면 pCmdLine 매개 변수가 인코딩되는 방법입니다. (pCmdLine에는 프로그램 이름과 다른 것들이 포함되어 있지 않으므로 어쨌든 GetCommandLine()을 사용해야합니다. 그러나 MSDN에서 어디에서 경고를 발견했는지 잊어 버렸습니다 ... GetCommandLineW()CommandLineToArgvW()을 합치면 argc/argv 쌍을 얻을 수 있습니다. WinMain()을 사용하는 프로그램에서.)

) 당신의 API를 ANSI 또는 유니 코드 _UNICODEUNICODE 매크로 경우 어떻게 결정,하지만 당신은 명시 적으로 W -suffixed 기능을 사용하여 오프 아마 더 낫다 (그러나 어쨌든 정의 된 두 개의 유지 .

윈도우가 유니 코드인지 여부는 윈도우 클래스에서 RegisterClassW()/RegisterClassExW()을 사용했는지 여부를 결정합니다.

+0

프로그램의 매크로를 어떻게 확인할 수 있습니까? 이 튜토리얼에서는 W end 함수를 명시 적으로 사용하지 않으므로 컴파일러가 매크로를 기반으로 실행될 특정 함수를 알고있을 수도 있습니다. –

+0

예, 컴파일러가 알고 있습니다. 시스템 헤더 파일의 코드는 헤더가 정의되어 있는지 확인하기 위해'# ifdef'를 사용하고 앨리어싱을 수행하는'#define FunctionNameHere FunctionNameHereW' (또는'FunctionNameHereA')를 사용합니다. 두 가지 방법으로 컴파일 될 수있는 프로그램을 생성하기위한 TCHAR 시스템도 있습니다. Windows 9x 또는 이전 버전을 여전히 지원해야하는 경우가 아니라면이 작업을 더 이상 수행 할 필요가 없습니다. 가장 좋은 방법은 모든 곳에서 유니 코드를 사용하는 것입니다. ASCII가 필요한 경우에는 UTF-8을 사용하고 필요하면 UTF-16으로 변환합니다 ('MultiByteToWideChar()'/'WideCharToMultiByte()'). – andlabs

+0

이것은 Windows API에서 사용되는 문자 세트를 제어하는'UNICODE' 전 처리기 심볼입니다. '_UNICODE'는 C 런타임 헤더 파일이 사용하는 문자 세트를 제어합니다. – IInspectable

0

여러분은 많은 것들처럼, 기본적인 것들에 대한 이해가 부족하다는 점에서 혼란스러워합니다. 먼저 직접 또는 간접적으로 우리 exe의 /ENTRY (Entry-Point Symbol)을 설정해야합니다. 직접 /ENTRY:function 옵션이 설정되지 않은 경우, UNICODE이 정의 된 경우 wWinMainCRTStartup을 선택하고 /SUBSYSTEM:WINDOWS이지만 UNICODE이 정의되지 않은 경우 /SUBSYSTEM:WINDOWSWinMainCRTStartup을 선택하십시오. wWinMainCRTStartup 내부적으로 wWinMain으로 전화하십시오. WinMainCRTStartup은 내부적으로 WinMain으로 전화하십시오. 그래서 엔트리 포인트는 정의 된 UNICODE 또는 no에 의존하지만, /ENTRY:function이 직접 설정되지 않은 경우에만 가능합니다. 우리는 예를 들어 UNICODE을 정의 할 수 있지만 /ENTRY:WinMainCRTStartup을 설정하고 "ANSI"WinMain을 구현해야합니다. 모든에서 우리 모두에서 CRT를 사용할 수 없으며 A 또는 코드의 기능 W 버전을 사용하는 방법에 대한 EP 어떠한 자신의 기능

을 설정 -이 MessageBoxW 또는 MessageBoxA 의존하는 형태로 확장하는 매크로 UNICODE가 정의 만입니다 MessageBox 말 컴파일 시간에. 매크로는 사용할 수 없지만 전체 함수 이름은 사용할 수 없습니다.그래서 우리는 동일한 코드 MessageBoxACreateFileW, CreateProcessA 및 프로그램이 유니 코드 구축 또는 설정 * 문자에 의해 결정된다하지 여부 CreateWindowExW