вызов LoadLibrary из подключаемого модуля ATL COM - PullRequest
0 голосов
/ 20 октября 2010

Привет У меня есть COM-плагин на основе ATL и есть еще одна сторонняя библиотека, которую я хочу использовать. Это не COM dll, а реализовано в C ++.

подробности о сторонних dll:

Тип конфигурации = Динамическая библиотека (.dll)

Использование MFC = Использовать MFC в статической библиотеке

Использование ATL = не использовать ATL

Набор символов = использовать мульти-btye набор символов

CRL support = нет поддержки clr

подробности о проекте COM dll:

Тип конфигурации = Динамическая библиотека (.dll)

Использование MFC = Использовать MFC в общей библиотеке

Использование ATL = динамическая ссылка на ATL

Набор символов = использовать набор символов Unicode

CRL support = нет clr support

Это мой код

HRESULT FinalConstruct()
{
    LPCWSTR libPath = _T("LicEnf.dll") ;
    const char * clibPath = "LicEnf.dll" ;

    SetLastError(0);
    HMODULE hMod = LoadLibraryA(clibPath);
    if(hMod==NULL)
    {

        LOG4CXX_TRACE(CALMLogger::GetModuleLogger(ModuleName),
            _T("Could not load library:GetLastError() returned ") << GetLastError());

    }

    return S_OK;
}

FinalConstruct называется 3 раза. hMod всегда 0 и в файле журнала у меня есть

Не удалось загрузить библиотеку: GetLastError () вернул 183

Не удалось загрузить библиотеку: GetLastError () вернул 126

Не удалось загрузить библиотеку: GetLastError () вернул 126

где

-183 (0xB7) = ERROR_ALREADY_EXISTS

-126 (0x7E) = ERROR_MOD_NOT_FOUND

С другой стороны, если я вызываю этот код из другого тестового приложения, которое является обычным исполняемым файлом, loadLibrary работает нормально. Есть ли какие-либо ограничения загрузки родной win32 dll из COM-dll и в чем здесь моя ошибка?

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

Вы пытались указать полный путь к библиотеке?

0 голосов
/ 20 октября 2010

LoadLibrary требуется полное имя пути.вот рабочий код

HRESULT FinalConstruct()
{
    LPCWSTR libPath = _T("d:\\projects\\LMS\\src\\LMS_LIB\\LicEnf\\Debug\\LicEnf.dll" ) ;
    DWORD  retval=0;
    BOOL   success; 
    TCHAR  buffer[BUFSIZE]=TEXT(""); 
    TCHAR  buf[BUFSIZE]=TEXT(""); 
    TCHAR** lppPart={NULL};

    SetLastError(0);
    SetErrorMode(0);
    retval = GetFullPathName(libPath,
         BUFSIZE,
         buffer,
         lppPart);

    HMODULE hMod = LoadLibrary(buffer);
    if(hMod==NULL)
    {
        int lastError = GetLastError();
        CString message;
        message.Format( _T("Failed in finding LicEnf.dll (%d)"), lastError );
        LOG4CXX_TRACE(CALMLogger::GetModuleLogger(ModuleName),message );

    }

    return S_OK;
}
...