一个项目, 显式调用外部dll, 外部dll里又引入了其它的一些dll . 这个问题弄了两三天才搞好,记录一下,少走一些弯路。
LoadLibrary 一般是要求加载的dll 与你的应用程序在同一目录, 而我加载的dll算是一个完整的项目,为了不和其它的混乱,所以又分了目录 。 bin/ project/ *.dll
那么在加载里,这里就需要用setdllpath去设置。 当然这都是正常的流程。
可结果是: vs 2015这么操作是成功的,
vs 2017就是失败的, 直成功了LoadLibrary(直接的dll),直接的dll又引入的如xxx.dll ,这个xxx.dll就失败了!
所以后来又尝试用loadlibraryEx 这个指定来加载,外部的也会跟随, 让我不明白的,有些电脑是成功的,有些电脑又不成功。
app- call ->a.dll (a.dll,引入了 b.dll,c.dll) app 与.a.dll在不同的目录下 , a,b,c在同目录。
最后是要调用a.dll 的函数成功 ,必须把 b.dll,c.dll放入到app相同目录下。
我解释不了这个现象,为什么要这样, 也只有这样才能成功。
m_hModule = LoadLibraryEx(dllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
DWORD error;
if (m_hModule == NULL)
{
error = GetLastError();
string strmsg;
strmsg = "LoadLibrary ";
strmsg += dllPath;
strmsg += " Fail!";
::MessageBox(NULL, strmsg.c_str(), _T("MTP"), 0);
return;
}
void CDllInvoke::LoadFunc(const CStringList &funcNames) {
POSITION rPos;
rPos = funcNames.GetHeadPosition();
while (rPos != NULL)
{
CString funcName = funcNames.GetNext(rPos);
PTRFUN f = (PTRFUN)::GetProcAddress(m_hModule, funcName);
if (f) {
m_funcAddrMaps.insert(pair<CString, PTRFUN>(funcName, f));
}
}
}
出现的结果是 LoadLibraryEx是成功的,
(*pFuncInvoke)((char*)inParams.c_str(),(char*)outParams);
调用函数就崩亏了,因为这个函数里又调用了其它的封装库,虽然在同一级目录,但是找不到要调用的库。。
mmp,记录一下!