C++ 在c++;如何从不同的库调用具有相同签名的dll函数?
在C#中,我有非常简单的代码: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
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)代码>应该可以做到这一点。