1

クライアント マシンに現在インストールされているサード パーティ製ソフトウェアのバージョンを照会するために Web ページで使用される ActiveX コントロールを作成しています。コントロールは、バージョンを整数として返す単一のメソッド (GetVersion) を公開するだけで済みます。私は ActiveX に非常に不慣れで、メソッドから値を正しく返すという単純なことに問題があります。IDL で次の宣言を使用する場合:

[id(1)] void GetVersion();

次の実装と組み合わせます。

BEGIN_DISPATCH_MAP(CDetectorCtrl, COleControl)
    DISP_FUNCTION_ID(CDetectorCtrl, "GetVersion", 1, GetVersion, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

void CDetectorCtrl::GetVersion()
{
    MessageBox(L"Test");
}

HTML からメソッドを呼び出して、MessageBox を正常に表示できます。

しかし、定義/コードを次のように変更すると:

[id(1)] int GetVersion();

BEGIN_DISPATCH_MAP(CDetectorCtrl, COleControl)
    DISP_FUNCTION_ID(CDetectorCtrl, "GetVersion", 1, GetVersion, VT_INT, VTS_NONE)
END_DISPATCH_MAP()

int CDetectorCtrl::GetVersion()
{
    MessageBox(L"Test");
    return 1337;
}

HTML からメソッドを呼び出すとクラッシュします。

4

1 に答える 1

1

聞かれて答えた...

この問題は、メソッド自体に AFX_MANAGE_STATE が見つからないことが原因で発生しました。

LONG CDetectorCtrl::GetVersion(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return 1337;
}
于 2008-11-19T14:12:31.223 に答える