从ATL COM插件调用LoadLibrary

时间:2010-10-20 12:25:21

标签: winapi atl

您好 我有一个基于ATL的COM插件,还有我想要使用的另一个第三方库。它不是COM DLL并且用C ++实现。

第三方dll的详细信息如下:

配置类型=动态库(.dll)

使用MFC =在静态库中使用MFC

使用ATL =不使用ATL

字符集=使用multi-btye字符集

CRL支持=无clr支持

关于COM dll项目的详细信息如下:

配置类型=动态库(.dll)

使用MFC =在共享库中使用MFC

使用ATL =动态链接到ATL

字符集=使用unicode字符集

CRL支持=无clr支持

这是我的代码

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

另一方面,如果我从另一个普通exe文件的测试应用程序调用此代码,loadLibrary工作正常。 从COM-dll加载本机win32 dll有什么限制吗?这里我的错误是什么?

由于

2 个答案:

答案 0 :(得分:2)

您是否尝试指定库的完整路径?

答案 1 :(得分:-1)

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;
}