一個項目, 顯式調用外部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,記錄一下!