我正在使用由製造商提供的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