我正在使用由制造商提供的dll在python中使用硬件组件的包装器。该DLL带有头文件和lib文件,因此很容易包含dll。 据我了解,compnent通过调用open函数来使用,给一些初始参数一个回调函数和一些额外的用户数据,然后调用start方法。在下面,组件将通过调用回调函数来传递数据。C++:创建正确类型的回调函数
DLL的头看起来是这样的:
#ifndef COMPONENT_DLL_INCLUDED
#define COMPONENT_DLL_INCLUDED
#pragma once
#ifndef DYNAMIC_COMPONENT_DLL_LINKAGE
// to allow include in C- and C++-code
#ifndef DLL_DECLSPEC
#ifdef __cplusplus
#define DLL_DECLSPEC extern "C" __declspec(dllimport)
#else
#define DLL_DECLSPEC __declspec(dllimport)
#endif
#endif
typedef struct{
eInformationType type;
eResultType error;
ComponentInfo info;
}AsyncInfo;
typedef struct{
BOOL someParameter;
BOOL someParameter2;
} ParamSet1;
typedef enum eType {
UndefinedType = 0x0,
Type1 = 0x1,
Type2 = 0x2
} Param2;
// exported type SendAsynInformation
typedef void (CALLBACK *SendAsyncInformation)(const AsyncInfo&, void *userInfo);
// exported functions
DLL_DECLSPEC eResultType COMPONENT_Open(const ParamSet1 Set1, const Param2 P2, SendAsyncInformation SendAsyncInfo, void *userInfo);
DLL_DECLSPEC eResultType COMPONENT_Start(void);
我的问题是,如何我一定要回调函数是什么样子?我试过的东西像
void myCallback(AsyncInfo *Info, myGlobals *g)
{
...something...
}
,然后通过这个回调open函数:
COMPONENT_Open(mySet1, myP2, myCallback, myVoidPtr);
但我总是得到这样的错误:
...cannot convert argument 3 from 'void (__cdecl *)(AsyncInfo *,myGlobals *)' to 'SendAsyncInformation'
我是相当新的C++这样最这可能是一个微不足道的问题。我尝试了很多东西,但我不知道如何去做。那么,我的错误是什么?
回答你的问题的重要信息不在这里 - 应该为其中一个头文件中的COMPONENT_Open函数定义 - 回调函数的签名(返回类型和参数类型)必须与库相同正在期待。错误消息告诉你类型不匹配 - 它是你收到的确切错误信息,然后我猜测回调函数可能是'void SendAsynchInfo(void);. –
使用std :: function –
mutex36