2016-11-20 14 views
-1

WinMainまたはwWinMainを使用するときに、ANSI関数ではなくUnicode関数を使用する必要があるときは、誰でも知っていますか?または、一般的な汎用関数を使用できますか?また、WinMainまたはwWinMainの使用法によって、関数で使用されるパラメータの型に影響を与えますか?空windoesを作成する二つの異なるチュートリアルでは例えばWinMainおよびwWinMainに基づくUnicodeおよびANSI関数とパラメータ

MSDNから1つのチュートリアルでは、次のように指定します。

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); 

お知らせWinMainの種類によっては、wWinMainがUnicodeに使用され、WinMainがANSIに使用されていることがわかっているので、WinMainのタイプにもよりますが、パラメータのタイプにも影響すると仮定しています。

また、wWinMainまたはWinMainを使用していて、次にMessageBoxなどの汎用関数を使用すると、WinMainの種類に応じてMessageBoxWまたはMessageBoxAに解決されますか?

おかげ

+1

を混在させることができます'マクロ)。 –

+0

@JonathanPotter UNICODEと_UNICODEの違いは何ですか? –

+0

ちょうど私が思うには、いくつかのものは1つを使用し、いくつかのものはもう1つを使用すると思います。 –

答えて

2

WinMain()wWinMain()プログラムがANSIまたはUnicodeとして実行するかどうかには影響しません。それが決定するのは、pCmdLineのパラメータがどのようにエンコードされるかです。 (pCmdLineにはプログラム名などが含まれていない可能性があるので、GetCommandLine()を使用してください。GetCommandLineW()CommandLineToArgvW()を組み合わせると、argc/argvのペアも取得できますあなたのAPIはANSIまたはUnicodeである場合に決定何WinMain()を使用するプログラムインチ)

_UNICODEUNICODEマクロですが、あなたはおそらく(明示的W -suffixed機能を使用したほうが良いですが、2つはとにかく定義され続けます) 。

ウィンドウがユニコードであるかどうかは、ウィンドウクラスでRegisterClassW()/RegisterClassExW()を使用したかどうかを決定します。

+0

プログラムのマクロを確認するにはどうすればいいですか?このチュートリアルでは、W end関数を明示的に使用していないため、コンパイラはマクロに基づいて実行される特定の関数を知っている可能性があります。 –

+0

はい、コンパイラは知っています。システムヘッダファイルのコードは、ヘッダが定義されているかどうかを調べるために '#ifdef'を使用し、エイリアシングを行うには' #define FunctionNameHere FunctionNameHereW'(または 'FunctionNameHereA')を使います。両方の方法でコンパイルできるプログラムを作成するためのTCHARシステムもあります。 Windows 9x以前のバージョンをサポートする必要がある場合を除いて、これを行う必要はありません。最良の方法は、どこでもUnicodeを使用することです.Unicodeが必要な場合は、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 を内部で呼び出す場合WinMainCRTStartupは内部でWinMainと呼び出します。エントリポイントは定義されたUNICODEまたはnoに依存しますが、/ENTRY:functionが直接設定されていない場合に限ります。たとえばUNICODEを定義することができますが、/ENTRY:WinMainCRTStartupを設定し、 "ANSI" WinMainを実装する必要があります。そして、すべての私たちはすべてのCRTを使用することはできませんとAまたはコード内の関数のWバージョンの使用についてEPとして任意の独自の機能

を設定する - これはMessageBoxWまたはMessageBoxA依存の形に展開されたマクロがUNICODEが定義されているのみであるMessageBoxを言いますコンパイル時に。マクロを使用することはできませんが、完全な関数名は使用できません。私たちはあなたのプログラムがUnicode用に構築されたかを順番に `UNICODE`と` _UNICODEが定義されてのVisual Studio(中*文字セット*オプションによって決定されているかどうか、同じコードでMessageBoxACreateFileWCreateProcessACreateWindowExW

関連する問題