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)
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 –
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
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? –