如何将动态生成的 C++ 函数作为 *funcprt 传递给 C API?
API 导出这个:
DllImport void api_register_func(char *func_name, void (*funcptr)(char *, char *));
我必须在运行时创建函数,因为我之前不知道它。 所以我用了一个类:
class JsFunc
{
public:
char * JsFuncName;
char * JsParameter;
void RunFunc(char * val1, char * val2)
{
printf("\nJsFunc.runFunc executed, JsParameter=%s passed\n",JsParameter);
}
};
然后这样调用它:
JsFunc * jsm = new JsFunc ();
jsm->JsFuncName = external_parameter1;
jsm->JsParameter = external_parameter2;
api_register_func(external_parameter1, jsm->RunFunc);
但是 VisualStudio 2015 告诉我:
Error C3867 'JsFunc::runFunc': non-standard syntax; use '&' to create a pointer to member VJCS C:\Users\astrauss\Source\Repos\VCJS\VCJS\VCJS.cpp 54
如果代码不好,我很抱歉,我不是 C/C++ 程序员,但需要让它在我的日常工作中运行。 谢谢!
最佳答案
不幸的是,您在这里没有太多选择。 API:
DllImport void api_register_func(char *func_name,
void (*funcptr)(char *, char *));
只允许你提供一个函数指针,没有任何上下文。所以你可以传入一个自由函数或者静态成员函数,但是你没有办法提供一个成员函数。如果你有上下文:
DllImport void better_api_register_func(char *func_name,
void *context,
void (*funcptr)(void *, char *, char *));
然后你可以写一个简单的 lambda:
api_register_func(external_parameter1,
jsm, //context
[](void *ctxt, char* arg1, char* arg2) {
static_cast<JsFunc*>(ctxt)->runFunc(arg1, arg2);
});
并且您有效地使用成员函数作为回调。但是,这不是一种选择。相反,您只能使用全局变量:
std::unique_ptr<JsFunc> the_global_func;
您可以在运行时分配:
the_global_func.reset(new JsFunc);
// set stuff
然后在 lambda 中使用全局变量。由于它是全局的,我们不需要(事实上,不能)捕获它——这意味着我们的 lambda 可以转换为函数指针:
api_register_func(external_paramter1,
[](char* arg1, char* arg2) {
the_global_func->runFunc(arg1, arg2);
});
关于c++ - 如何将函数从 C++ 类传递给 C API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31818350/