1

win32 プログラムのエントリ ポイントである WinMain をクラス メソッドとして使用することは可能でしょうか? 例えば;

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

ありがとう!

4

2 に答える 2

5

No.は、プログラムの「エントリ」ポイントとしてクラスのメンバーになるWinMain ことはできません。さらに言えば、 (グローバル名前空間以外の)どの名前空間にも置くことはWinMain できません。たとえば、以下に示すように、プログラムの「エントリ」ポイントにすることはできません。user::WinMain

namespace user
{
     int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}

プログラムのエントリ ポイントは、グローバル名前空間で定義する必要があります。

ただし、この名前の関数をクラス内 (または他の名前空間) に持つことができ、グローバル名前空間で定義された実際のエントリ ポイントから呼び出すことができます。WinMainしかし、cApp::WinMain(またはuser::WinMain) は決してプログラムの「エントリ」ポイントではありません。

于 2011-04-30T11:47:57.933 に答える
1

まず、それ(およびWndProc)はstatic、必要なプロトタイプと一致するメンバーである必要があります。本当の問題は、コンパイラをnoグローバル関数にバインドすることです。そのため、静的クラスメンバーにバインドするには、msvcなどのリンカーオプションを使用する必要がありますが/entry:<symbol>、スコープの解決にバグが発生する可能性があります。静的メンバーを持つことはできません。CRTwinmainエントリを使用して、オブジェクトのインスタンスを作成し、そのWinMainメンバーfuncを呼び出すことができます。その場合、標準ライブラリに直接バインドできない可能性があり、次のことを行う必要があります。 CRTは自分で初期化します(ただし、crt msvcソースから取得できます)

于 2011-04-30T11:52:24.480 に答える