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

calling Dll with another Dll in C++

本文关键字:Dll 调用 另一个 C++      更新时间:2023-10-16

我有一个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。。。有人能帮我吗?

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

原因之一可能是:找不到DLL2,因此无法启动DLL1。

您还应该注意导出Locale(extern"C"INT PASCAL export)的方式是正确的!

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

为了解决windows中的库依赖关系,您可以使用procmon监控程序。请参阅(http://technet.microsoft.com/en-ca/sysinternals/bb896645.aspx)