C++ 在c++;如何从不同的库调用具有相同签名的dll函数?

C++ 在c++;如何从不同的库调用具有相同签名的dll函数?,c++,dll,C++,Dll,在C#中,我有非常简单的代码: class MicexBridgeNativeAdapterWrapper { [DllImport("MicexBridgeNativeAdapter.dll", CharSet = CharSet.Ansi), SuppressUnmanagedCodeSecurity] public static extern bool Connect(); ... class CGateNativeAdapter { [DllImpo

在C#中,我有非常简单的代码:

class MicexBridgeNativeAdapterWrapper
{
    [DllImport("MicexBridgeNativeAdapter.dll", CharSet = CharSet.Ansi), SuppressUnmanagedCodeSecurity]
    public static extern bool Connect();
    ...


class CGateNativeAdapter
{

    [DllImport("CGateNativeAdapter.dll"), SuppressUnmanagedCodeSecurity]
    public static extern bool Connect();
    ....
然后我只调用
MicexBridgeNativeAdapterWrapper.Connect()
或/和
CGateNativeAdapter.Connect()
,因此我从两个不同的DLL导入了具有完全相同签名的函数,并同时使用它们

现在我想从C++中使用这些DLL。上面的代码是C++模拟什么?

也是很简单的。< /P>
HMODULE lib1 = LoadLibrary("MicexBridgeNativeAdapter.dll");
HMODULE lib2 = LoadLibrary("CGateNativeAdapter.dll");

typedef bool (*ConnectFnPtr)();

ConnectFnPtr ConnectFromLib1 = (ConnectFnPtr)GetProcAddress(lib1, "Connect");
ConnectFnPtr ConnectFromLib2 = (ConnectFnPtr)GetProcAddress(lib2, "Connect");

ConnectFromLib1(); // Calls Connect from MicexBridgeNativeAdapter
ConnectFromLib2(); // Calls Connect from CGateNativeAdapter
这也很简单

HMODULE lib1 = LoadLibrary("MicexBridgeNativeAdapter.dll");
HMODULE lib2 = LoadLibrary("CGateNativeAdapter.dll");

typedef bool (*ConnectFnPtr)();

ConnectFnPtr ConnectFromLib1 = (ConnectFnPtr)GetProcAddress(lib1, "Connect");
ConnectFnPtr ConnectFromLib2 = (ConnectFnPtr)GetProcAddress(lib2, "Connect");

ConnectFromLib1(); // Calls Connect from MicexBridgeNativeAdapter
ConnectFromLib2(); // Calls Connect from CGateNativeAdapter

此外,我还必须添加cast,使一切都像
initializefnptrinitialize=(InitializeFnPtr)GetProcAddress(libMicexBridgeAdapter,“initialize”)当然,我忘记了(从内存中编写代码)。我会解决的。另外,不要忘记调用约定。您可能需要编写ie.
typedef bool_ustdcall(*ConnectFnPtr)()typedef void(u stdcall*MicexOrderUpdateCallback)(void*)__declspec(dllexport)void InitializeCallback(MicexOrderUpdateCallback MicexOrderUpdateCallback)
应该为DLL提供一个头文件,该头文件声明所有回调函数类型。如果没有,可以在程序中重新声明回调的类型。然后只需在函数ptr声明中使用此类型:
typedef void(*InitializeCallbackPtr)(MicexOrderUpdateCallback callback)
void\u stdcall MyHandler(void*someData){//Do somethine here}
,然后:
InitializeCallbackPtr(MyHandler)应该可以做到这一点。此外,我还必须添加cast,使一切都像这样工作
InitializeFnPtr initialize=(InitializeFnPtr)GetProcAddress(libMicexBridgeAdapter,“initialize”)当然,我忘记了(从内存中编写代码)。我会解决的。另外,不要忘记调用约定。您可能需要编写ie.
typedef bool_ustdcall(*ConnectFnPtr)()typedef void(u stdcall*MicexOrderUpdateCallback)(void*)__declspec(dllexport)void InitializeCallback(MicexOrderUpdateCallback MicexOrderUpdateCallback)
应该为DLL提供一个头文件,该头文件声明所有回调函数类型。如果没有,可以在程序中重新声明回调的类型。然后只需在函数ptr声明中使用此类型:
typedef void(*InitializeCallbackPtr)(MicexOrderUpdateCallback callback)
void\u stdcall MyHandler(void*someData){//Do somethine here}
,然后:
InitializeCallbackPtr(MyHandler)应该可以做到这一点。