2011-02-22 8 views
1

J'essaie d'utiliser une DLL COM de VC++ 2005. J'ai créé un TestCOMlib.dll avec ATL, créé une interface simple ISimple et ajouté une propriété (type LONG, name Property01) et une méthode (name Method01). La DLL semble être correctement enregistrée dans le système (j'utilise OleView pour vérifier les entrées).#import conduire à un HRESULT 0x80040154 "Classe non enregistrée"

J'ai créé une simple application de dialogue MFC pour utiliser la DLL COM. J'utilise la directive # import pour incorporer des informations de la bibliothèque de types. Visual Studio a créé pour moi le fichier tlh et tli.

Puis j'ai essayé d'obtenir l'interface ISimple mais j'obtiens l'erreur 0x80040154. Le code Je cours à l'intérieur de l'application de test est le suivant:

HRESULT hr = S_OK; 
hr = CoInitialize(NULL); 

ISimplePtr myRef(__uuidof(ISimple)); 

// Test prop and method 
myRef->Property01 = 5; 
LONG test = myRef->Property01; 
LONG ret = myRef->Method01(_T("Test input")); 
ret = myRef->Method01(NULL); 

myRef = NULL; 
CoUninitialize(); 

La ligne renvoyant l'erreur 0x80040154 est ISimplePtr myRef (__ uuidof (ISimple)). OleView affiche correctement l'interface et dans le registre les entrées semblent être bonnes.

Qu'est-ce que je fais mal? Une idée?

Cordialement

+2

Oups, nous avons trouvé le problème. Je dois remplacer __uuidof (ISimple) par __uuidof (Simple). – gionny

Répondre

4

La classe sous-jacente de ces pointeurs intelligents COM est _com_ptr_t. Vous essayez d'utiliser ce constructeur:

// Constructs a smart pointer given the CLSID of a coclass. This 
// function calls CoCreateInstance, by the member function 
// CreateInstance, to create a new COM object and then queries for 
// this smart pointer's interface type. If QueryInterface fails with 
// an E_NOINTERFACE error, a NULL smart pointer is constructed. 
explicit _com_ptr_t( 
    const CLSID& clsid, 
    IUnknown* pOuter = NULL, 
    DWORD dwClsContext = CLSCTX_ALL 
); 

point clé est que vous devez passer le CLSID du coclasse, vous passez l'IID de l'interface. C'est pourquoi __uuidof (Simple) fonctionne.

+0

Merci, d'avoir passé du temps pour cette explication! – gionny

+0

ce qui est IID en passant, j'ai la même erreur..http: //stackoverflow.com/questions/27832181/unhandled-exception-in-vc-hresult-failed pls y répondre – Wielder

Questions connexes