2010-05-18 38 views
1

當用戶按下登錄按鈕時會調用StartComObjects函數,並在用戶按下取消按鈕時調用StopComObjects函數。 StartComObjects函數使用CComPtr.CoCreateInstance創建COM對象,並使用AfxConnectionAdvise設置一些連接點。當用戶按下Cancel按鈕時,使用AfxConnectionUnadvise斷開連接點,並在調用CComPtr上的Release之前停止COM對象。CComPtr CoCreateInstance返回0x80070582(類已存在)

當我第二次按下登錄按鈕時,CComPtr.CoCreateInstance返回0x80070582(類已存在)。這可以防止在第二次調用StartComObjects時創建COM對象。我不知道爲什麼這不起作用。不應該CComPtr ::釋放COM對象,並允許我創建一個新的舊的後,停止?有什麼辦法可以解決這個問題嗎?

回答

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

去翻你的代碼的地方,共類中使用的RegisterClass(防爆)。當實例被銷燬時它必須使用UnregisterClass。或者避免再次註冊窗口類。或者忽略特定的錯誤代碼。