0

これは今すぐ試すことができます。

WinMain と wWinMain の両方を定義し、スタティック ライブラリとしてコンパイルします。

実行ファイルexeの新規プロジェクトを作成します。

文字セット設定 UNICODE系を設定します。(define _UNICODE)

作成した静的ライブラリをリンクします。

次に、プログラムは WinMain から開始します。

文字セットがマルチバイトかユニコードかに関係なく、WinMain と wWinMain の両方が定義されている場合、WinMain が呼び出されます。

これは、静的ライブラリで WinMain を定義した場合にのみ発生します。

含むソース プロジェクトで WinMain と wWinMain を定義すると、正しく動作します。

Unicode システムは wWinMain を呼び出し、マルチバイト システムは WinMain を呼び出します。

なぜそれが起こるのですか?

4

1 に答える 1

0

リンカーは、エントリ ポイントが何であるかを推測し、対応する __tmainCRTStartup の実装を置き換えようとします。ただし、ここには 2 つの制限があります。

  • リンカーは、2 つ以上のエントリ ポイントを推測するようには設計されていません。実際、リンカは警告LNK4067: ambiguous entry pointを複数の選択肢が見つかったときに生成します。
  • リンカはプリプロセッサを認識しないため、定義したプリプロセッサ シンボルは、リンカの実行時には関係ありません。

したがって、なぜこれが表示されるのかという質問に答えるには、「未定義の動作」のケースの1つにぶつかっています。この動作は保証されておらず、新しいコンパイラ バージョンで変更される可能性があるため、この動作に依存しないでください。

_tWinMain を使用して 1 つのエントリ ポイントを定義することをお勧めします。

int APIENTRY _tWinMain(HINSTANCE hInstance,   
                 HINSTANCE hPrevInstance,   
                 LPTSTR    lpCmdLine,   
                 int       nCmdShow)   

リンカー用の /ENTRY オプションもありますが、これを使用することはお勧めしません。より危険であり、単一エントリ関数を定義して /SUBSYSTEM リンカー オプションに正しい値を渡すだけで同じ機能を実現できるためです。

于 2011-04-18T19:06:58.753 に答える