顯式調用dll 注意事項

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章