2010-10-20 44 views
0

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

对第三方的dll 详情如下:

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

静态库使用MFC =使用MFC的

使用ATL的=不使用ATL

字符集=使用多btye炭设置

CRL支持=无CLR小号在COM DLL项目upport

详情如下:

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

共享库

使用ATL的使用MFC =使用MFC的=动态链接到ATL

字符集=使用unicode字符集

CRL supp ORT =无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是否有任何限制,以及我的错误是什么?

感谢

+1

哪个EXE加载你的COM对象,并且是在与EXE相同的目录下的LicEnf.dll?您是否尝试过使用LicEnf.dll的完全限定路径? – 2010-10-20 12:39:30

回答

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

你尝试到指定库路径?

+0

thnx。我做过并且工作过。即使所有的DLL和EXE都处于相同的路径,如何实现完整路径?我以为我应该可以用文件名打电话。 – tguclu 2010-10-20 13:32:56