Winmainエントリポイントをクラスに埋め込みますか?
質問
私は疑問に思っていました、Win32プログラムのエントリポイント - ウィンメイン - をクラスの方法として使用することは可能ですか?例えば;
class cApp {
public:
cApp();
~cApp();
cGuiManager* guiManager;
cServerManager* serverManager;
cAudioManager* audioManager;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInst, LPSTR lpCmdLine, int nCmdShow);
static LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
};
ありがとう!
解決
いいえ。 WinMain
できません プログラムの「エントリ」ポイントとしてクラスのメンバーになります。そしてそのことについては、 WinMain
できません なれ 任意の名前空間で (グローバルネームスペース以外)。たとえば、 user::WinMain
以下に示すように できません プログラムの「エントリ」ポイントになります。
namespace user
{
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}
プログラムのエントリポイント でなければなりません グローバルネームスペースで定義されています。
ただし、クラス内(または他の名前空間)内にこの名前を持つ関数を使用することができます。 実際 エントリーポイント WinMain
グローバルネームスペースで定義されています。しかしcApp::WinMain
(また user::WinMain
)プログラムの「エントリ」ポイントではありません。
他のヒント
まず、それ(およびwndproc)は static
必要なプロトタイプに一致するメンバー。本当の問題は、コンパイラをNOグローバル関数にバインドさせることです。なぜなら、MSVCのようなリンカーオプションを使用する必要があるからです /entry:<symbol>
静的クラスのメンバーにバインドしてみるには、スコープ解像度でバグアウトする可能性があります...静的メンバーを持たない場合は、CRT Winmainエントリを使用してオブジェクトのインスタンスを作成してから呼び出すことができます。 WinMain
メンバーFUNC、OFCあなたは標準ライブラリに直接バインドできない可能性があり、自分でCRT Initを実行する必要があります(ただし、CRT MSVCソースからつかむことができます)