6

WinMain は、デフォルトのメイン エントリ ポイント「main」を「置き換える」関数です。

ユーザーは、次のようにメインのエントリ ポイントを定義できます。

int WINAPI WinMain(...) { }


この種のカプセル化はどのように行われますか?

おそらく、ある時点で次のようになります。

int main() // This must be defined somewhere in windows.h
{
    return WinMain(...);
}

質問: WinMain を呼び出すような独自のカプセル化を行うにはどうすればよいですか? 注: 私が作成したライブラリは DLL なので、次のようになります。

// This is the minimal code for the application which uses 'MyLibrary'
#pragma comment(lib, "MyLibrary.lib")
include "MyLibrary.h"

void Main(MyCustomParameter *params)
{
    // Write user code here
}

ただし、問題は、DLL が関数を「認識」していないMain()ため、「未解決の外部シンボル」コンパイル エラーがスローされることです。では、どうすればこのようにカプセル化できますか?

4

3 に答える 3

4

カスタム main 関数のシグネチャを決定し、それを「extern」(C++ の場合は extern 「C」) として宣言する必要があります。_main次に、アプリケーション コードでその関数を定義し、実際のエントリ ポイントを持つ静的ライブラリにリンクする必要があります。例えば:

extern "C" int my_main(int argc, char *argv[]);

int main(int argc, char *argv[])
{
    return my_main(argc, argv);
}
于 2013-03-28T19:13:03.457 に答える
3

実際、実際のエントリ ポイントはメインでも WinMain でもありません。実際のエントリ ポイントは、wWinMainCRTStartup、WinMainCRTStartup、wmainCRTStartup、および mainCRTStartup のいずれかです。しかし、これらは Windows.h では定義されておらず、CRT の一部です。<VS installation folder>\VC\crt\src\crtexe.cでコードを確認できます。これらはそれぞれ初期化を行ってから、wWinMain、WinMain、wmain、および main のいずれかをそれぞれ呼び出します。

他の誰かが述べたように、/ENTRY スイッチを使用してエントリ ポイントをオーバーライドできますが、カスタム パラメーターを使用することはできません。これが、最初にこれを行う理由の 1 つです。

于 2013-03-28T20:06:06.127 に答える
2

リンカのデフォルトのエントリ ポイント名は「main」です。デフォルトをオーバーライドして、任意の関数で開始することができます。

/ENTRY (エントリーポイントシンボル)

于 2013-03-28T19:12:12.467 に答える