gpt4 book ai didi

C++:创建正确类型的回调函数

转载 作者:行者123 更新时间:2023-11-28 05:10:33 26 4
gpt4 key购买 nike

我正在开发一个包装器,使用制造商提供的 dll 在 python 中使用硬件组件。 DLL 带有头文件和 lib 文件,因此很容易包含 dll。据我所知,通过调用 open 函数来使用组件,为它提供一些初始参数、回调函数和一些额外的用户数据,然后调用 start 方法。下面组件将通过调用回调函数来传递数据。

dll 的 header 看起来像这样:

#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...
}

然后将此回调传递给打开函数:

COMPONENT_Open(mySet1, myP2, myCallback, myVoidPtr);

但我总是会遇到这样的错误:

...cannot convert argument 3 from 'void (__cdecl *)(AsyncInfo *,myGlobals *)' to 'SendAsyncInformation'

我是 C++ 的新手,所以这很可能是一个微不足道的问题。我尝试了很多事情,但我不知道如何做对。那么,我的错误是什么?

最佳答案

您需要将 myCallback 定义为

void CALLBACK myCallback(const AsyncInfo&, void *userInfo)
{ ... }

并将COMPONENT_Open 调用为

COMPONENT_Open(mySet1, myP2, (SendAsyncInformation)&myCallback, myVoidPtr);

函数原型(prototype)中的 CALLBACK 关键字(实际上是宏)指示编译器它应该使用什么调用约定,如果不匹配,可能会在堆栈帧清理期间给你异常.

由于 COMPONENT_Open 函数将回调作为 SendAsyncInformation 类型接受,这是一个 typedef,因此您需要转换您的地址 myCallbackSendAsyncInformation

关于C++:创建正确类型的回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43594904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com