2009-11-23 2 views
1

Je travaille sur "Developer's Workshop to COM and ATL 3.0" par Andrew W. Troelsen.Classe non enregistrée

Je suis en train de mettre en œuvre le laboratoire au chapitre 3.

Il vous montre comment construire un client COM pour se connecter à un serveur COM inprocess qui a été développé dans un laboratoire plus tôt.

Lorsque j'exécute le client, l'erreur "Classe non enregistrée" s'affiche lorsque j'appelle "CoGetClassObject".

Voici un extrait de code:

// Get the class factory pointer of CoCar. 
hr = CoGetClassObject(CLSID_CoCar, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void**)&pCF); 

if(SUCCEEDED(hr)) 
{ 
    // Make a CoCar & get ICreateCar 
    hr = pCF->CreateInstance(NULL, IID_ICreateCar, (void**)&pICreateCar); 
    pCF->Release(); 
} 
else 
{ 
    char buff[100]; 
    BOOL bRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, hr, 0, buff, sizeof(buff), 0); 
    std::cout << buff << std::endl; 
} 

J'ai essayé d'enregistrer la classe en fusionnant le fichier .reg suivant avec le registre du système:

REGEDIT 
HKEY_CLASSES_ROOT\CarInProcServer.CoCar\CLSID = {EFC76CF8-71B8-477b-890A-1233BD9177CB} 
HKEY_CLASSES_ROOT\CLSID\{EFC76CF8-71B8-477b-890A-1233BD9177CB} = CarInProcServer.CoCar 
HKEY_CLASSES_ROOT\CLSID\{EFC76CF8-71B8-477b-890A-1233BD9177CB} 
\InprocServer32 = C:\Users\Steven\Documents\Visual Studio 2005\Projects\CarInProcServer\release\CarInProcServer.dll 

Je ne sais pas si cela est pertinent , mais voici mon fichier .def:

LIBRARY "CarInProcServer" 
EXPORTS 
DllGetClassObject @1 PRIVATE 
DllCanUnloadNow  @2 PRIVATE 

NB: J'utilise Windows 7

Quelqu'un peut-il aider?

Merci


Got it!

J'ai ajouté manuellement:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Classes \ CLSID {EFC76CF8-71B8-477b-890A-1233BD9177CB} \ InprocServer32 = « C: \ Users \ Steven \ Documents \ Visual Studio 2005 \ Projets \ CarInProcServer \ release \ CarInProcServer.dll "

au Registre.

Il semble que la fusion du fichier .reg avec cette entrée ne fonctionne pas. Merci à Ken White pour son aide. (et d'autres qui ont suggéré des solutions)

Répondre

4

Ouvrez une invite de commande, dans votre dossier de DLL et exécuter regsvr32.exe:

cd \Users\Steven\Documents\Visual Studio 2005\Projects\CarInProcServer\release 
regsvr32 CarInProcServer.dll 
+0

J'ai essayé, sans succès. Je pense que l'auteur a l'intention d'utiliser ce fichier reg au lieu de regsvr32 et DllRegisterServer() Selon le livre: "Nous allons écrire nos propres scripts de registre (fichier REG), qui peuvent être utilisés pour fusionner automatiquement les informations du serveur dans le registre , évitant le besoin de coder DllRegisterServer() à la main –

+1

Steven, je ne comprends pas pourquoi vous voulez contourner DllRegisterServer, à moins que ce ne soit juste un exemple précoce juste pour faire avancer les choses ... – bacar

+3

Le problème peut être un droit problème sur Vista ou Win7.Je remarque que votre fichier reg écrit à HKCR; est-ce par hasard Win7 64 bits? Si tel est le cas, cette ruche est virtualisée pour les applications 32 bits (et les DLL). Rechercher SO pour "WOW_64 registry", et vous devriez trouver quelques messages sur la façon de résoudre ce problème. HKCR n'est pas accessible en écriture pour un utilisateur standard (non administrateur) sur Vista ou Win7, que ce soit; avez-vous importé le fichier reg en cours d'exécution sous un compte d'administrateur? –

2

Avez-vous essayé d'enregistrer le serveur COM avec regsvr32.exe?

0

La valeur de CLSID_CoCar égale à la valeur dans votre fichier reg? ({EFC76CF8-71B8-477b-890A-1233BD9177CB}), ou ont-ils été régénérés à des valeurs différentes?

Si oui, avez-vous vérifié que ces valeurs ont été correctement fusionnées dans votre base de registre?

Avez-vous appelé CoInitialize?

+0

J'ai vérifié, et les GUID correspondent dans le serveur, et dans le registre. J'ai appelé 'CoInitialize (NULL);' dans le client au début de la principale. –

Questions connexes