我有一个当用户按下“登录”按钮时调用的StartComObjects函数,以及一个当用户按下“取消”按钮时调用的StopComObjects函数。 StartComObjects函数使用CComPtr.CoCreateInstance创建COM对象,并使用AfxConnectionAdvise设置一些连接点。当用户按下“取消”按钮时,将使用AfxConnectionUnadvise断开连接点,并在调用CComPtr上的Release之前停止COM对象。

当我再次按下登录按钮时,CComPtr.CoCreateInstance返回0x80070582(该类已经存在)。这样可以防止在第二次调用StartComObjects时创建COM对象。我不确定为什么这行不通。 CComPtr::Release释放COM对象并允许我在停止旧对象后创建一个新对象吗?有什么办法可以解决这个问题?

最佳答案

这是Windows错误(功能7,错误代码1410),由RegisterClass(Ex)引起。此示例代码复制了它:

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

在您的代码中查找coclass使用RegisterClass(Ex)的位置。实例销毁后,它必须使用UnregisterClass。或避免再次注册窗口类。或忽略特定的错误代码。

关于c++ - CComPtr CoCreateInstance返回0x80070582(该类已经存在。),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2858979/

10-10 16:59