2013-02-21 4 views
2

Я после этого учебника сайты:HRESULT "Класс не зарегистрирован" Внедрение простой COM сервера DLL

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:

enter image description here

я уже запустить

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 

, что я предполагал поставить все Guids мне нужно в реестре (The Guids были получены мной) ,

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

Edit: Ах да, я переехал #include // содержит определение DEFINE_GUID

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

+0

Какой инструмент вы используете для создания COM-библиотеки DLL? – OldProgrammer

+0

Я только что закодировал файлы, продиктованные в учебнике, в проекте Win32 dll в Visual Studio и построил его. Он сгенерировал DLL-файл, и именно так я указываю свой проект. – valkn0t

+0

regsvr32 вызывает DllRegisterServer в DLL, и вы не предоставляете этот интерфейс. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms682162(v=vs.85).aspx Кроме того, создавайте ли вы все это вручную, как учебное упражнение? Если нет, вы можете устранить эту проблему, используя существующие фреймворки, такие как ATL. – OldProgrammer

ответ

1

Наиболее вероятное объяснение: вы строите свой 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 существует стандартная поддержка.

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

+0

Ошибка 32-битного 64-битного значения не вызвала бы ошибку «точка входа не найдена», это был бы плохой формат изображения или что-то в этом роде. –

+0

уточненный ответ - ему не хватает метода DllRegisterServer – jstevenco