CComPtr CoCreateInstance返回0x80070582(类已存在。)

时间:2010-05-18 16:04:57

标签: c++ com atl smart-pointers

当用户按下Login按钮并且当用户按下Cancel按钮时调用StopComObjects函数时,我调用了一个StartComObjects函数。 StartComObjects函数使用CComPtr.CoCreateInstance创建COM对象并使用AfxConnectionAdvise设置一些连接点。当用户按下取消按钮时,使用AfxConnectionUnadvise断开连接点,并且在CComPtr上调用Release之前停止COM对象。

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

1 个答案:

答案 0 :(得分: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;
}

查看代码中coclass使用RegisterClass(Ex)的地方。在销毁实例时必须使用UnregisterClass。或者避免再次注册窗口类。或者忽略特定的错误代码。