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

发布于 2024-09-01 20:28:12 字数 443 浏览 5 评论 0原文

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

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

I have a StartComObjects function called when the user presses the Login button and a StopComObjects function called when the user presses the Cancel button. The StartComObjects function uses CComPtr.CoCreateInstance to create the COM object and sets up some connection points using AfxConnectionAdvise. When the user presses the Cancel button the connection points are disconnected using AfxConnectionUnadvise and the COM object is stopped before calling Release on the CComPtr.

When I press the login button a second time the CComPtr.CoCreateInstance returns 0x80070582 (Class already exists). This prevents the COM object from being created on the second call to StartComObjects. I am not sure why this isn't working. Shouldn't CComPtr::Release free the COM object and allow me to create a new one after the old one was stopped? Is there any way to get around this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

流年已逝 2024-09-08 20:28:12

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

It is a Windows error (facility 7, error code 1410), caused by RegisterClass(Ex). This sample code reproduces it:

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

Look through your code for places where the coclass uses RegisterClass(Ex). It must use UnregisterClass when the instance is destroyed. Or avoid registering the window class again. Or ignore the specific error code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文