代码之家  ›  专栏  ›  技术社区  ›  Trevor Balcom

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

  •  1
  • Trevor Balcom  · 技术社区  · 15 年前

    我有一个StartComObjects函数,当用户按下登录按钮时调用,当用户按下取消按钮时调用。startComObjects函数使用ccomptr.coCreateInstance创建COM对象,并使用afxConnectionAdvise设置一些连接点。当用户按下“取消”按钮时,连接点将使用afxconnectionunadvise断开连接,并且在调用ccompter上的release之前,COM对象将停止。

    当我再次按下登录按钮时,ccomptr.coCreateInstance返回0x80070582(类已经存在)。这将防止在第二次调用StartComObjects时创建COM对象。我不知道为什么这不起作用。CComptr::release不应该释放COM对象并允许我在旧对象停止后创建一个新对象吗?有没有办法避开这个?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Hans Passant    15 年前

    这是由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。或者避免再次注册窗口类。或者忽略特定的错误代码。