CComPtr CoCreateInstance возвращает 0x80070582 (класс уже существует.) - PullRequest
1 голос
/ 18 мая 2010

У меня есть функция StartComObjects, вызываемая, когда пользователь нажимает кнопку входа в систему, и функция StopComObjects, вызываемая, когда пользователь нажимает кнопку отмены. Функция StartComObjects использует CComPtr.CoCreateInstance для создания COM-объекта и устанавливает некоторые точки подключения с помощью AfxConnectionAdvise. Когда пользователь нажимает кнопку «Отмена», точки подключения отключаются с помощью AfxConnectionUnadvise, и объект COM останавливается перед вызовом Release для CComPtr.

Когда я нажимаю кнопку входа во второй раз, CComPtr.CoCreateInstance возвращает 0x80070582 (класс уже существует). Это предотвращает создание объекта COM при втором вызове StartComObjects. Я не уверен, почему это не работает. Разве CComPtr :: Release не должен освобождать COM-объект и позволять мне создавать новый после того, как старый был остановлен? Есть ли способ обойти это?

1 Ответ

3 голосов
/ 18 мая 2010

Это ошибка 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;
}

Посмотрите в своем коде места, где кокласс использует RegisterClass (Ex). Он должен использовать UnregisterClass, когда экземпляр уничтожен. Или избегайте регистрации класса окна снова. Или игнорируйте конкретный код ошибки.

...