显式调用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,记录一下!

猜你喜欢

转载自blog.csdn.net/kaizi318/article/details/100632435