1

ユーザーが [ログイン] ボタンを押したときに呼び出される StartComObjects 関数と、ユーザーが [キャンセル] ボタンを押したときに呼び出される StopComObjects 関数があります。StartComObjects 関数は、CComPtr.CoCreateInstance を使用して COM オブジェクトを作成し、AfxConnectionAdvise を使用していくつかのコネクション ポイントを設定します。ユーザーが [キャンセル] ボタンを押すと、接続ポイントは AfxConnectionUnadvise を使用して切断され、CComPtr で Release を呼び出す前に COM オブジェクトが停止されます。

ログイン ボタンをもう一度押すと、CComPtr.CoCreateInstance が 0x80070582 を返します (クラスは既に存在します)。これにより、StartComObjects の 2 回目の呼び出しで COM オブジェクトが作成されなくなります。なぜこれが機能しないのかわかりません。CComPtr::Release で COM オブジェクトを解放し、古いオブジェクトが停止された後に新しいオブジェクトを作成できるようにすべきではありませんか? これを回避する方法はありますか?

4

1 に答える 1

3

RegisterClass(Ex) が原因の Windows エラー (ファシリティ 7、エラー コード 1410) です。このサンプル コードはそれを再現します。

#include "stdafx.h"
#include <windows.h>
#include <assert.h>

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
    WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.hInstance = hInstance;
    wcex.lpszClassName = L"Example";
    ATOM at1 = RegisterClassEx(&wcex);
    assert(at1 != 0);
    // Register again, should fail with error 1410
    ATOM at2 = RegisterClassEx(&wcex);
    assert(at2 == 0);
    int err = GetLastError();
    assert(err == ERROR_CLASS_ALREADY_EXISTS);
    return 0;
}

コードを調べて、コクラスが RegisterClass(Ex) を使用している場所を探します。インスタンスが破棄されるときは、UnregisterClass を使用する必要があります。または、ウィンドウ クラスを再度登録しないでください。または、特定のエラー コードを無視します。

于 2010-05-18T17:37:43.033 に答える