您好 我有一个基于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有什么限制吗?这里我的错误是什么?
由于
答案 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;
}