HRESULT & quot; Класс не зарегистрирован & quot; Реализация простой библиотеки COM-сервера

Я следую этому уроку сайтов:

http://progtutorials.tripod.com/COM.htm

Предварительные доказательства: Visual Studio 2010, Windows 7 64 бит.

и я кодирую примеры в разделе 3. (Реализация серверной DLL). Я напечатал код точно так, как показано, и я получаю исключение «Класс не зарегистрирован» при выполнении этого кода в строке 12 кода, описанного в разделе 4.1 (где учебник покажет вам, как получить доступ к DLL, и у меня есть после 3.1 к письму):

 hresult hr = CoGetClassObject(CLSID_Car, CLSCTX_SERVER, NULL, IID_IClassFactory, (void **) &pClassFactory);

Я пробовал бегать:

 regsvr32 xyz.dll

с xyz.dll является путем к моей DLL для регистрации DLL. Это привело к ошибке при попытке найти DLLRegisterServer:

введите описание изображения здесь

Я уже бегал

 REGEDIT
HKEY_CLASSES_ROOT\CarDLL.Car\CLSID = {d969084c-b758-43ea-a218-a48763167abd}
HKEY_CLASSES_ROOT\CLSID\{d969084c-b758-43ea-a218-a48763167abd} = CarDLL.Car
HKEY_CLASSES_ROOT\CLSID\{d969084c-b758-43ea-a218-a48763167abd}\InProcServer32 = C:\Users\wiocl2\Documents\Visual Studio 2010\Projects\CarDLL\debug\CarDLL.dll

что я предполагал поместить все необходимые мне GUID в реестр (GUIDS были созданы мной).

Я предполагаю, что в класс необходимо добавить функцию, которая позволяет его регистрировать, но я не знаю, как это сделать и как разобраться в этом. Я в некотором роде заблудился, так как давно не работаю с COM. Если бы кто-то мог дать мне толчок в правильном направлении, это было бы полезно.

Изменить: Да, я переехал
#include // содержит определение DEFINE_GUID

в файл iid.h из iid.cpp, в противном случае я получал неразрешенные внешние ошибки при сборке.

2

Решение

Наиболее вероятное объяснение: вы создаете свой COM-объект как 32-битную DLL, но регистрация была выполнена как 64-битная DLL.

Обработка: откройте привилегированное командное окно администратора и перейдите к местоположению вашей DLL (C: \ Users \ wiocl2 \ Documents \ Visual Studio 2010 \ Projects \ CarDLL \ debug). Оказавшись там, введите:

c:\windows\sysWOW64\regedit <filename of .reg file whose contents are displayed above>

Это запустит 32-разрядную версию REGEDIT, гарантируя, что записи реестра будут созданы в правильной части улья. Чтобы убедиться в этом, вы должны увидеть запись для {d969084c-b758-43ea-a218-a48763167abd} в HKLM \ Software \ Wow6432Node \ Classes \ CLSID, не HKLM \ Software \ Classes \ CLSID.

DllRegisterServer это метод, который вы можете реализовать в библиотеке DLL вашего COM-сервера, и требуется, если вы хотите использовать regsvr32 чтобы выполнить ту же операцию, для которой вы в настоящее время используете подход .REG. Применяется то же самое предостережение: для 32-битной DLL вам нужно вызвать c:\windows\sysWOW64\regsvr32.exe,

И да! COM все еще в основном живы и здоровы 🙂 По крайней мере, в VS 2012 все еще есть стандартная поддержка.

Надеюсь, это поможет.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]