在 C++ 中用另一个 Dll 调用 Dll

Posted

技术标签:

【中文标题】在 C++ 中用另一个 Dll 调用 Dll【英文标题】:calling Dll with another Dll in C++ 【发布时间】:2013-08-25 07:06:12 【问题描述】:

我有一个 DLL,我想从另一个 DLL 中调用它。我用这段代码制作了一个 C++ MFC DLL:

    extern "C" INT PASCAL EXPORT Locale()
    

        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        typedef BOOL(WINAPI* LPFNDLLGetStringLabel)( CWnd *, int, LPTSTR , CWinApp *, LPSTR , LPCTSTR );
        int bRes = 0; //false;
        char achEvent[ 250 ];
        HINSTANCE hDLL;   

        hDLL = LoadLibrary( L"C:\\1.dll" );
        if ( hDLL != NULL )
        
            CString ocStrInfo;
            ocStrInfo += "Alfa";
            ocStrInfo += ";";
            ocStrInfo += "Alfa";
            ocStrInfo += ";";
            ocStrInfo += "Alfa";

                LPFNDLLGetStringLabel lpfnDllFunc;
                lpfnDllFunc = (LPFNDLLGetStringLabel)GetProcAddress( hDLL, "GetStringLabel");

                if ( lpfnDllFunc )
                    if( lpfnDllFunc( NULL, 111, (LPTSTR)ocStrInfo.GetBuffer(), AfxGetApp(), achEvent, NULL )) 
                        return bRes=1;
                    else
                        return bRes=0;
                    

            FreeLibrary( hDLL );
    
   

以下代码正在调用第二个 DLL,但它不能正常工作:

int main()
HINSTANCE dllHandle = LoadLibrary(L"C:\\2.dll");
if(dllHandle == NULL )
    std::cout << "alarm";

typedef int(*Locale)(void);
FARPROC pTest = GetProcAddress(HMODULE (dllHandle),"Locale");
if(pTest == NULL )
    std::cout << "alarm";

Locale con = Locale(pTest);
int r= 1; 
r =con();
cout << r;
FreeLibrary(dllHandle);
getchar();
return 0;

但是 dllhandle 等于 null...有人可以帮助我吗?

【问题讨论】:

为什么不能像调用第一个 DLL 一样调用第二个 DLL?究竟是什么问题? 调用 LoadLibrary 后检查 GetLastError。一个可能的原因可能是 Dll 位数不同,例如,尝试将 32 位 Dll 加载到 64 位进程。 【参考方案1】:

你可以看看Dependency Walker。在配置文件模式中使用此工具将显示您的二进制文件(EXE - DLL1 - DLL2)之间的依赖关系是否可以在运行时解决。

一个原因可能是:DLL1 无法启动,因为没有找到 DLL2。

你还应该看看你导出Locale(extern "C" INT PASCAL EXPORT)的方式是正确的!

如前所述,您还应该看看 GetLastError。

【讨论】:

【参考方案2】:

为了解决 Windows 中的库依赖问题,您可以使用 procmon 监视您的程序。见 (http://technet.microsoft.com/en-ca/sysinternals/bb896645.aspx)

【讨论】:

以上是关于在 C++ 中用另一个 Dll 调用 Dll的主要内容,如果未能解决你的问题,请参考以下文章

在VS2015中用C++创建MFC规则动态库DLL

在 Linux 上使用纯 C 项目中用 C++ 编写的库?

如何在程序中用显式加载的方式使用DLL中的导出类

在JAVA中用JNI调用C++程序报错,说找不到所依赖的库。

delphi中用代码实现注册Ocx和Dll

Unity中C#调用C++写的DLL之Swig篇