如何在第三方库调用的回调函数中传递/使对象/变量可访问

How to pass/make an object/variable accessible inside a callback function which is called by a third party library?

本文关键字:对象 访问 变量 函数 第三方 调用 回调      更新时间:2023-10-16

如何让callbackFunction访问globalObject

我使用第三方库library.h,它有一个方法libraryFunctionlibraryFunction的输出是一个libraryFunctionOutput,它被传递给回调函数callbackFunction

如何传递另一个对象(例如globalObject)以在回调函数callbackFunction中使用?

不幸的是,第三方库已编译,因此我无法对其进行任何更改。

#include <stdio.h>
#include "library.h"
int callbackFunction(int libraryFunctionOutput):
    printf("%s, %d", libraryFunctionOutput, globalObject);
    return 1;
int main(int argc, char* argv[])
{
   int globalObject = 0;
   libraryFunction(callbackFunction);
}

在文档中,函数显示为:

int __stdcall libraryFunction(const char*    filename,
                              unsigned int   flags,
                              int            userID,
                              MathrelCallback callbackFunction);

MathrelCallback结构体定义如下:

struct MathrelCallback {MathrelHeader header;
                        MathrelInfo   data;
                        unsigned int Type;
};

如果库确实接受函数指针(而不是像std::function这样的通用Callable),并且不提供将上下文或用户指针传递给回调的能力,则必须使全局对象成为全局对象(尽管存在所有缺点):

#include <stdio.h>
#include "library.h"
static int globalObject = 0;
int callbackFunction(int libraryFunctionOutput)
{
    printf("%s, %d", libraryFunctionOutput, globalObject);
    return 1;
}
int main(int argc, char* argv[])
{
   libraryFunction(callbackFunction);
}