2010-05-18 16 views
1

J'ai une fonction StartComObjects appelée lorsque l'utilisateur appuie sur le bouton Connexion et une fonction StopComObjects appelée lorsque l'utilisateur appuie sur le bouton Annuler. La fonction StartComObjects utilise CComPtr.CoCreateInstance pour créer l'objet COM et définit certains points de connexion à l'aide de AfxConnectionAdvise. Lorsque l'utilisateur appuie sur le bouton Annuler, les points de connexion sont déconnectés en utilisant AfxConnectionUnadvise et l'objet COM est arrêté avant d'appeler Release sur le CComPtr.CComPtr CoCreateInstance renvoie 0x80070582 (la classe existe déjà.)

Lorsque j'appuie sur le bouton de connexion une deuxième fois, CComPtr.CoCreateInstance renvoie 0x80070582 (la classe existe déjà). Cela empêche la création de l'objet COM lors du deuxième appel à StartComObjects. Je ne sais pas pourquoi cela ne fonctionne pas. CComPtr :: Release ne devrait-il pas libérer l'objet COM et me permettre d'en créer un nouveau après l'arrêt de l'ancien? Y a-t-il un moyen de contourner cela?

Répondre

3

Il s'agit d'une erreur Windows (facilité 7, code d'erreur 1410), causée par RegisterClass (Ex). Ce code exemple reproduit:

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

Regardez dans votre code pour les endroits où l'coclasse utilise RegisterClass (Ex). Il doit utiliser UnregisterClass lorsque l'instance est détruite. Ou évitez d'enregistrer à nouveau la classe de fenêtre. Ou ignorez le code d'erreur spécifique.