Я следую этому уроку сайтов:
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, в противном случае я получал неразрешенные внешние ошибки при сборке.
Наиболее вероятное объяснение: вы создаете свой 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 все еще есть стандартная поддержка.
Надеюсь, это поможет.
Других решений пока нет …