Регистрация COM
От: Vikong  
Дата: 20.12.07 09:32
Оценка:
Привет всем!
Столкнулся с загадкой. Если некую DLL регистрировать командой regsvr32, то потом в программе объект, описанный в этой библиотеке, создается и работает нормально.
При регистрации напрямую, из программы, с помощью функции DllRegisterServer, регистрируется успешно, но при попытке создать объект из библиотеки, вылетает с ошибкой "OLE error code 0x80004005: Неопознанная ошибка"
Может, кто сталкивался с такой фишкой?
Re: Регистрация COM
От: lollipop  
Дата: 20.12.07 10:41
Оценка:
Здравствуйте, Vikong, Вы писали:
V>При регистрации напрямую, из программы, с помощью функции DllRegisterServer, регистрируется успешно, но при попытке создать объект из библиотеки, вылетает с ошибкой "OLE error code 0x80004005: Неопознанная ошибка"
Как это с помощью DllRegisterServer. ? Можете уточнить. С проблемой сталкивался регистрации нескольких длл из Wix и гуи. С гуи проблем небыло.
regsvr32 идёт с открытыми исходниками. Выдирал функцию оттуда. Вот по памяти может поможет


bool RegisterLibrary(CString dllName)
{
    int iReturn = 0;
    HRESULT (STDAPICALLTYPE * lpDllEntryPoint)(void);
    const char _szDllRegSvr[] = "DllRegisterServer";
    const char _szDllUnregSvr[] = "DllUnregisterServer";
    HINSTANCE _hInstance;
    BOOL bVisualC = FALSE;
    BOOL bUnregister = FALSE;
    LPCSTR pszDllEntryPoint = _szDllRegSvr;
    LPTSTR ptszDllEntryPoint = NULL;
    LPCTSTR pszDllName = NULL;
    LPCTSTR pszTok;
    size_t EntryPointSize = 0;
    _hInstance = ::GetModuleHandle(NULL);
    HINSTANCE hLib = LoadLibraryEx(dllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
    if (hLib < (HINSTANCE)HINSTANCE_ERROR) 
      return false;
    // Find the entry point.
    (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);

    if (lpDllEntryPoint == NULL) {
       return false;
    }

    // Call the entry point.
    if (FAILED((*lpDllEntryPoint)())) {
      return false;
    }
return true;
}

Смысл такой что загрухаем как длл. И вызываем DllRegisterServer. CString dllName — путь указывать полный дабы избежать траблов с вистой. У меня покрайней мере работал.
ЗЫ выдрано и перекопипастено из msdn
Re[2]: Регистрация COM
От: Vikong  
Дата: 20.12.07 10:52
Оценка:
Здравствуйте, lollipop, Вы писали:

L>Здравствуйте, Vikong, Вы писали:

V>>При регистрации напрямую, из программы, с помощью функции DllRegisterServer, регистрируется успешно, но при попытке создать объект из библиотеки, вылетает с ошибкой "OLE error code 0x80004005: Неопознанная ошибка"
L> Как это с помощью DllRegisterServer. ? Можете уточнить. С проблемой сталкивался регистрации нескольких длл из Wix и гуи. С гуи проблем небыло.
L>regsvr32 идёт с открытыми исходниками. Выдирал функцию оттуда. Вот по памяти может поможет
...
L> Смысл такой что загрухаем как длл. И вызываем DllRegisterServer. CString dllName — путь указывать полный дабы избежать траблов с вистой. У меня покрайней мере работал.
L> ЗЫ выдрано и перекопипастено из msdn

Грубо говоря, так и делаю. Одно отличие — программа написана на FoxPro 9
Вот код, он достаточно прозрачный:
   DECLARE INTEGER DllRegisterServer ;
      IN (lcServerPath)

   IF DllRegisterServer() = 0
      wait window nowait lcServerPath + " has been registered..."
   ELSE
      wait window lcserverPath +  " could not be registered..." TIMEOUT 5
   ENDIF

lcServerPath — полный путь к dll
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.