2013-03-28 18 views
5

WinMainは、デフォルトのメインエントリポイント 'main'を '置き換える'関数です。C++:カスタムMain関数の実装

ユーザーが

int WINAPI WinMain(...) { } 


のようなそのメインエントリポイントを定義することができるカプセル化のこの種はどのように行われていますか?

まあ、ほとんどの場合、いくつかの点で、それは次のようになります。

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

が質問:はどのように私は、WinMain関数を呼び出し、自分のようにカプセル化を達成することができますか?注意:私が作ったライブラリはDLLである、それは次のようになりますので:しかし、IS、DLLがMain()機能を「知っている」ので、「未解決をスローしないこと

// 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 
} 

問題外部シンボル 'コンパイルエラー。では、どうすればこのようにカプセル化できますか?

答えて

3

あなたのカスタム、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); 
} 
+0

"extern" C "'でもまだ解決されていない外部があります。それはあなたのようにメインの代わりに内部エントリポイントとしてWinMainを使うからですか? – bytecode77

+0

@DevilsChild:あなたがしていることを言うのは難しいです。あなたのエントリーポイントが 'WinMain'なら - あなたのメインを' WinMain'から呼び出します。 'main()'だけであれば 'main()'から呼び出してください。まずw/o変更をコンパイルするコードを取得し、変更を加えて何が壊れているかを確認します。または、少なくともあなたの問題を示す完全な例を入れてください...そうでなければ、あなたがやっていることをデバッグするのは難しいです。 –

+0

明らかに、それはインクルード構造の問題です。私はいくつかの非常に最小限のコードをここにまとめています:http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip 「ExampleClass.h」は含まれていません。 – bytecode77

2

リンカのデフォルトエントリポイント名は "main"です。 デフォルトを上書きして、任意の機能から開始することができます。

/ENTRY (Entry-Point Symbol)

2

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

誰かが述べたように、/ ENTRYスイッチでエントリポイントを無効にすることはできますが、カスタムパラメータを使用することはできません。

+0

私はMainCRTStartupについて知っていたが、私は確かにカスタムパラメータを使用することができます。私の試みはここにあります:http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip いくつかの未知のインクルード問題のために動作しませんが、 'ExampleClass 'es、あなたはそれが動作することがわかります。残りの問題は今ではまだ機能しないインクルード構造です。 – bytecode77