Tag: 回调

用于包装带有void *参数的C回调的模板魔术?

假设我正在使用一个C API,它允许您注册带有void*闭包的回调: void register_callback(void (*func)(void*), void *closure); 在C ++中,拥有比void*更强的类型是很好的,所以我想创建一个包装器,让我注册强类型的C ++回调: template void CallbackWrapper(void *p) { return F(static_cast(p)); } void MyCallback(int* param) {} void f(void *closure) { register_callback(CallbackWrapper, closure); } 这没关系。 这个解决方案的一个很好的属性是它可以将我的回调内联到包装器中,所以这个包装方案没有开销。 我认为这是一个要求。 但是如果我能让API看起来更像这样会很好: void f2() { RegisterCallback(MyCallback, closure); } 我希望我可以通过推断模板参数来实现上述目的。 但我无法弄清楚如何使其发挥作用。 我到目前为止的尝试是: template void RegisterCallback(void (*f)(T*), T* closure) { register_callback(CallbackWrapper, closure); } 但这不起作用。 任何人都有一个神奇的咒语,使f2()工作在上面,同时保持零开销性能特征? 我想要一些适用于C […]

从C调用Swift的最佳方法是什么?

从Swift调用C非常简单,但是我正在研究在C中制作双向包装器,所以我的C必须调用Swift函数。 现在,我可以通过在C中声明函数指针来实现这一点,并且在Swift端将它们设置为在Swift中调用代码之后让我的C函数调用它们。 我的C头文件: typedef void (*callback_t)(void); void callBackIntoSwift( callback_t cb ); 我的C实现文件: #include “stuff.h” #include void callBackIntoSwift( callback_t cb ) { printf( “Will call back into Swift\n” ); cb(); printf( “Did call back into Swift\n” ); } 在桥接头中包含我的C头文件后,我可以在Swift端执行以下操作: let cb: callback_t = { someKindOfSwiftFunction() } callBackIntoSwift( cb ) 甚至: callBackIntoSwift { someKindOfSwiftFunction() } 有没有更好的方法来做到这一点,不需要函数指针和回调? 我想让C端直接调用someKindOfSwiftFunction […]

Libev,如何将参数传递给相关的回调

我陷入了在libev中传递争论的局面。 通常,libev在类似* receive_callback *的函数中接收包,这没关系,但实际上,我们需要根据收到的包调度相对* write_callback *来处理特定的作业。 例如: S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff; switch(pstRecvMsg->wMsgType) { case 1: ev_io_init(w, write_callback1, w->fd, EV_WRITE); break; case 2: ev_io_init(w, write_callback2, w->fd, EV_WRITE); break; case 3: // ……. } 我的问题是,如果write_callbackX还必须读取write_callbackX的特定内容,我们如何将recv_buff参数传递给callbackX? 我们必须承担全球变量的负担和丑陋吗?

如何在C ++ / CLI中包装C库回调

给定以下C库以及要求设置缓冲区的回调事件,如何以类型安全的方式编写适当的C ++ / CLI包装器? // The callback signature typedef void (__cdecl *BUFFERALLOCATOR)(void *opaque, void **buffer); // A struct that contains the context of the library struct lib_context_base_s { // The stored callback function pointer BUFFERALLOCATOR buffer_allocator; // Opaque pointer that contain the local context. Needed in C because // C doesn’t have closures (functions that […]

C回调和非Go线程

如何从不是由Go创建的线程调用C中的Go代码? 我分配给C函数指针,以便Go不创建的线程可以调用该指针并进入Go代码? Update0 我不想使用SWIG。 回调将来自线程Go以前没有见过。 cgo/life和pkg/runtime任何内容都不会显示此行为AFAICT。

是否可以将Swift类转换为C void *指针?

是否可以将Swift类转换为C void *指针? // swift class class MyClass { } var myClass = MyClass() var p: UnsafeMutablePointer = myClass //<- failed //c function void someSwiftClass(void *context); 谢谢

从C回调调用C ++方法

我正在将C库用于C ++项目。 这个库允许我注册一个C回调,在这个回调中我应该调用一个对象的C ++方法。 情况是这样的: myclass.h class myclass { public: myclass(); void callme(); }; extern “C” { void init(): int callback(int,int); } myclass.cpp myclass::myclass() { init(); } void myclass::callme() { cout<<"Ok\n"; } extern "C" { void init() { //code setlibraryCallback(callback); //code } int callback(/*some arguments that I can't change*/ int a, int b) { //I […]

在C ++抽象类中实现回调(对于C库)为纯虚拟

我在使用C音频库时遇到了问题(使用ASIO SDK构建的PortAudio,但这与这个问题并不相关;技术细节只会妨碍我提出这个问题) 。 简单地说,来自该库的某个C函数需​​要我给它一个回调函数,该函数返回一个值并接受某些参数; 为了清楚起见,让我们说回调应该是这样的: int callback(int arg) 并且对库函数的调用如下所示: theCLibraryFuntion(foo, bar, callback); 使用这样的库(即以程序C风格的方式)工作正常,但我想在结构良好的C ++类中包装与我相关的库函数。 我需要图书馆的项目是迄今为止我所做过的最大的项目,所以OO-design对我来说是必须的。 我想在C ++中创建一个抽象类,它为要实现的派生类提供纯虚函数,然后让这个实现用于知道库的类的回调。 换句话说,我需要实际的多态性而不是令人讨厌的函数指针。 到目前为止,我还没能写出这样的课程。 编译器不允许我将任何类的非静态成员函数作为回调传递给C库函数。 我理解为什么,但我想知道一些解决方法。 只要该解决方法,如果它存在,给我前端类的多态行为,我不关心后端代码变得多么邪恶。 如果不存在这样的解决方法,那就这样吧。 我非常了解C在后台如何工作,但我对C ++中OOfunction的技术性知之甚少,因此我将假设有一种方法。 提前致谢! 注意:一个会增加大量开销的解决方法对我来说可能毫无价值。 我被迫使用这个C portaudio库,因为它是唯一一个能够为我的项目所需的音频流提供极低延迟的API,因此大幅度增加开销并不是一个真正的选择。

使用回调从外部解压缩dll显示文件名(Inno Setup)

最初在这里被问到,但被要求将其作为一个单独的问题提交。 我在下面的C中编写了以下dll,我在Inno Setup Installer中使用它来提取游戏文件。 这是一个最初使用16位安装程序的游戏的替换安装程序,文件从CD-ROM中复制。 我希望能够使用InnoTools InnoCallback来显示使用我的dll提取的文件名,但由于这是我第一次尝试使用C编码,我不知道该怎么做。 可以在此处找到此function的示例: http : //freearc.org/InnoSetup.aspx 我希望能够使用外部DLL中的文件名设置WizardForm.FilenameLabel.Caption。 我的Inno安装脚本的相关部分: function VolEx( filename, outputpath: String ): Integer; external ‘VolEx@files:volex.dll stdcall’; (DriveLetter是CD-ROM的路径,即“D:\”,因此输出当前显示为“D:\ world \ archive.vol”。我的目标是“C:\ game-path \ world” \存档\ file.ext“) procedure VolExtract(); begin if not DirExists(WizardDirValue() + ‘\’ + Worlds[w]) then begin CreateDir(WizardDirValue() + ‘\’ + Worlds[w]); end; for n := 0 to […]

将成员函数指针传递给c样式函数

我试图将成员函数指针传递给c风格的函数(因为它是C中的lib) 它想要的指针定义为: void (*)(int, const char*) 所以我试图传递的function是: void Application::onError(int error, const char *description) 我试图用这段代码传递: setCallback(bind(&Game::onError, this, placeholders::_1, placeholders::_2)); 这给了我以下错误: cannot convert ‘std::_Bind_helper<false, void (Application::*)(Application*, int, const char*), Application* const, const std::_Placeholder&, const std::_Placeholder&>::type {aka std::_Bind<std::_Mem_fn(Application*, std::_Placeholder, std::_Placeholder)>}’ to ‘GLFWerrorfun {aka void (*)(int, const char*)}’ for argument ‘1’ to ‘void (* glfwSetErrorCallback(GLFWerrorfun))(int, const char*)’ glfwSetErrorCallback(bind(&Application::onError, this, […]