Как зарегистрировать класс в реестре? - PullRequest
0 голосов
/ 22 июля 2009

Привет, что не так с моим кодом? Я пытаюсь зарегистрировать класс в реестре следующим образом, но во время отладки он показывает, что класс не зарегистрирован, и приложение вылетает.

Что не так в этом коде, пожалуйста, помогите мне.

Test::IDiscover *pICalc = NULL;
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, 
  CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc)); 
if(hres<0) 
   cout<<"register failure"<<endl;
else
   cout<<"register success"<<endl;  // and i am not free the memory any where...

И я тоже пробовал как:

IDiscoverPtr pt(__uuid(SqlClass));
HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, 
  CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc));
if(hres<0)
   cout<<"register failure"<<endl;
else
   cout<<"register success"<<endl;

Если мне это нравится, когда я отлаживаю это на

IDiscoverPtr pt__uuid(SqlClass));

Отладка переходит к этой функции и показывает внутреннюю ошибку COM.

Ответы [ 4 ]

1 голос
/ 22 июля 2009

Вы пытаетесь создать экземпляр класса COM с именем SqlClass. Вы на самом деле не пытаетесь зарегистрировать этот класс COM. Чтобы зарегистрировать COM-класс, вам нужно будет сделать

regsvr32 SqlClass.dll, если ваш COM-класс не обрабатывается сервером

sqlclass.exe / regserver, если ваш класс COM является сервером вне процесса.

Тот факт, что вы используете COM интеллектуальные указатели, говорит мне, что ваш SqlClass находится в DLL, и вы используете #import для обращения к нему. Так что используйте regsvr32 SqlClass.dll

Дополнительный аспект заключается в том, что всегда используйте макросы SUCCEEDED или FAILED для проверки возвращаемого значения hresult для COM-вызовов.

1 голос
/ 22 июля 2009

Где определен IDiscover интерфейс? Вам нужно зарегистрировать ту конкретную DLL / EXE, в которой вы реализовали этот интерфейс. Чтобы дать вам подсказку, это будет DLL, в которой у вас есть класс с именем SqlClass. Скорее всего, это будет Com DLL. Зарегистрируйте эту DLL, используя regsvr32 в командной строке.

Что-то вроде:

regsvr32 "MyDllFullPath.dll"

Чтобы узнать, что именно является ошибкой, сообщите нам, что именно является значением hres. Я предполагаю, что это числовое значение, которое переводится как Class Not Registered error.

0 голосов
/ 22 июля 2009

При регистрации сборок .NET, открытых для COM, вы используете утилиту regasm.exe. Важно не забыть ключ командной строки /codebase. Без этого переключателя regasm только поместит имя DLL в реестр, а не полный путь к нему, и когда потребитель (ваше приложение) попытается вызвать CoCreateInstance (), COM не сможет выяснить, где на самом деле находится DLL.

0 голосов
/ 22 июля 2009

Поскольку вы говорите, что уже зарегистрировали библиотеку DLL с помощью regasm.exe, проверьте правильность регистрации с помощью oleview.exe. Перейдите к узлу «Все объекты» в левом дереве и найдите, присутствует ли ваш компонент SqlClass.

Я не могу увидеть вызов CoInitialize (NULL) в вашем коде. Вы вызываете CoInitialize (NULL) перед вызовом CoCreateInstance?

Также, пожалуйста, укажите код ошибки COM?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...