c++ - 如何将函数从 C++ 类传递给 C API?

标签 c++ c

如何将动态生成的 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/

相关文章:

C - 赋值中不兼容的类型 - 结构和字符数组

c++ - 在线程上的 2D vector 上 push_back 是安全的吗?

c++ - 为什么要在类外重新声明静态变量来初始化静态变量?我们不能只初始化它而不是重新声明它吗?

c++ WINAPI 共享内存结构数组

c - 在c中根据另一个数组按升序对一个数组进行排序

c - 表达式 : addition of two value of type unsigned char 的确切类型是什么

c++ - 在应用程序中合并文本文件?

c++ - 为什么我不能初始化静态成员

c++ - 程序运行良好数小时,最终出现内存地址 0x10 的段错误

编译器优化不编译常量?