2009-07-22 6 views
0

Salut quel est le problème avec mon code J'essaie d'enregistrer la classe dans le registre de la manière suivante, mais pendant que je débogue il montre que la classe n'est pas enregistrée et l'application se bloque.Comment enregistrer une classe dans le registre?

Quel est le problème dans ce code s'il vous plaît Aidez-moi.

Test::IDiscover *pICalc = NULL; 
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, 
    CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc)); 
if(hres<0) 
    cout<<"register failure"<<endl; 
else 
    cout<<"register success"<<endl; // and i am not free the memory any where... 

Et moi aussi essayé comme:

IDiscoverPtr pt(__uuid(SqlClass)); 
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, 
    CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc)); 
if(hres<0) 
    cout<<"register failure"<<endl; 
else 
    cout<<"register success"<<endl; 

Si je fais comme ça quand je le débogage à ce

IDiscoverPtr pt__uuid(SqlClass)); 

Le débogage va à cette fonction et indique l'erreur COM interne.

+1

Il existe des macros FAILED et SUCCEEDED pour tester les HRESULT - vous devriez les utiliser au lieu de comparer à 0 - qui donne un code plus lisible. – sharptooth

Répondre

1

Où l'interface IDiscover est-elle définie? Vous devez enregistrer ce DLL/EXE particulier dans lequel vous avez implémenté cette interface. Pour vous donner un indice, ce sera la DLL dans laquelle vous avez une classe nommée SqlClass. Ce sera probablement une DLL Com. Enregistrez cette DLL en utilisant regsvr32 sur la ligne de commande.

Quelque chose comme:

regsvr32 "MyDllFullPath.dll" 

Pour en savoir plus, quelle est l'erreur exacte, dites-nous que ce qui est exactement la valeur de hres. Je devine que c'est une valeur numérique qui se traduit par Class Not Registered erreur.

+0

J'enregistre déjà cette DLL en utilisant RegAsm.exe et génère le fichier tlb et en important ce fichier tlb dans le programme C++ d'où j'utilise le code ci-dessus. – Cute

+1

OK, Les choses deviennent intéressantes ici. Vous avez utilisé RegAsm ce qui signifie que votre DLL est une DLL .NET, non? Si oui, avez-vous appliqué les attributs ComVisible (True) à vos classes et interfaces? – Aamir

+0

@Cute: Avez-vous utilisé le commutateur/codebase lors de l'appel de regasm.exe? – sharptooth

1

Vous essayez de créer une instance d'une classe COM appelée SqlClass. Vous n'essayez pas réellement d'enregistrer cette classe COM. Pour enregistrer la classe COM, vous devez faire

regsvr32 SqlClass.dll si votre classe COM est le serveur inprocess

sqlclass.exe/regserver si votre classe COM est un hors processus serveur. Le fait que vous utilisiez des pointeurs COM intelligents me dit que votre SqlClass réside dans une DLL et que vous utilisez #import pour vous y référer. Donc, utilisez regsvr32 SqlClass.dll

Un aspect supplémentaire est que toujours utiliser les macros SUCCEEDED ou FAILED pour vérifier la valeur de retour hresult des appels COM.

0

Puisque vous dites que vous avez déjà enregistré la DLL en utilisant regasm.exe, vérifiez si l'enregistrement a été fait correctement en utilisant oleview.exe. Allez dans le noeud "Tous les objets" dans l'arborescence de gauche et trouvez si votre composant SqlClass est présent.

Je ne parviens pas à voir l'appel CoInitialize (NULL) dans votre code. Appelez CoInitialize (NULL) avant d'appeler CoCreateInstance?

Pouvez-vous également spécifier le code d'erreur COM?

+0

J'appelle CoInitialize (NULL) avant CoCreateInstance. – Cute

+0

Pouvez-vous spécifier le code d'erreur COM? – Modicom

0

Lors de l'enregistrement d'assemblys .NET exposés à COM, vous utilisez l'outil regasm.exe. Il est important de ne pas oublier le commutateur de ligne de commande /codebase. Sans ce commutateur, regasm ne mettra que le nom de la DLL dans le registre, pas le chemin d'accès complet et quand le consommateur (votre application) essayera d'appeler CoCreateInstance() COM ne pourra pas savoir où la DLL réside réellement.

Questions connexes