Tag: 回调

在.NET中使用C回调函数

我正在使用.NET内部的C库这一切都很好用。 但我遇到了回调函数的麻烦。 我有这个C代码: Bool someCallBack(const char *name, int reason) { //some logic here return True; } int main(int argc, char **argv){ SetCallback(someCallBack) } 在头文件中,SetCallback定义为: typedef Bool (*CallbackType)(const char *name, int reason); #define DLL_USE __declspec(dllimport) DLL_USE void SetCallback(CallbackType callBack); 当我执行一个触发回调的函数时,这一切都在C中正常工作。 现在我想从.NET中做到这一点 在.NET中我有这个代码 _ Public Shared Sub SetCallback(ByVal callBack As CallbackType) End Sub Delegate Function CallbackType(ByVal name […]

如何从DLL设置委托/回调(C和C#之间的互操作)

我有一个静态库(* .a for iOS),它包含一些我需要分配给C#回调的函数。 代码在没有回调的情况下工作正常,但是当我将委托添加到结构时,它失败并出现以下错误: ArgumentException: The specified structure must be blittable or have layout information. Parameter name: structure at FMOD_Listener.LoadPlugins () [0x00000] in :0 at FMOD_Listener.Initialize () [0x00000] in :0 (Filename: currently not available on il2cpp Line: -1) 这是本机代码(C): extern “C” { typedef void (F_CALLBACK *basic_callback) (int *value1); typedef struct telephone { int area_code; […]

如何从C#调用ac函数

我想在C#中使用这个C函数: typedef void (*WRITE_CALLBACK)(int hMountEnv, unsigned __int64 NumBytesWritten, void* pContext); 我该如何定义它以便我可以调用它? 我需要做任何其他事情才能使这项工作成功吗?

C. sqlite3_exec中的SQLite:回调函数中的参数设置在main()中调用时打印不完整的数据

我正在努力实现一些非常基本的东西。 但不幸的是,我无法得到预期的结果。 我有一个名为emp_info的sqlite表,在以下字段中有9个员工记录: SR_NO [0],NAME [1],AGE [2],SEX [3],ADDRESS [4],EMPID [5],CARDID [6]和SALARY [7] 。 要访问该表并按照sql查询获取员工记录,我在C中有以下程序: #include #include #include #include static int callback(void *param, int argc, char *argv[], char **azColName){ int i=0; if(argc == 0) return 0; char **res = (char **)param; *res = (char *)realloc(*res, sizeof(*res)); //for(i=0; i<argc; i++){ //printf("%s = %s\n", azColName[i], argv[i] ? argv[i] […]

连续扫描流缓冲区中字符串的最佳方法

我有这种情况,我的function不断接收各种长度的数据。 数据可以是任何东西。 我想找到我在这个数据中寻找特定字符串的最佳方法。 该解决方案将需要以某种方式缓冲以前的数据,但我无法解决问题。 以下是问题的示例: DATA IN – > [\ x00 \ x00 \ x01 \ x23B] [] [LABLABLABLABLA \ x01TO] [KEN] [BLA \ x01] … 如果每个[…]代表一个数据块而[]代表一个没有项目的数据块,那么扫描字符串TOKEN的最佳方法是什么? 更新:我意识到这个问题有点复杂。 []不是分隔符。 我只是用它们来描述上面例子中的块的结构。 此外,TOKEN不是静态字符串。 它是可变长度的。 我认为逐行读取的最佳方法是问题是如何将可变长度的流缓冲区读入行。

具有直接呼叫和间接呼叫的Openssl线程安全回调函数注册

我正在Linux中编写一个C库(比方说,libA),它利用Openssl来执行base64编解码器,哈希等。其他一些项目(例如projB)利用libA来做某事,而这些项目本身也调用了Openssl API。 因此,projB以两种方式调用Openssl API: 直接调用Openssl API:projB – > Openssl 间接调用Openssl API:projB – > libA – > Openssl 同时,它正式宣布 Openssl不是线程安全的,除非在Openssl中注册了至少两个回调函数: void ssl_locking_function(int mode,int n,const char * file,int line) unsigned long ssl_threadid_function() libA向projB公开以下API: int InitA(无效) int ActionStuff() void DestroyA() 为了确保Openssl的线程安全,有两个解决方案: #1。 libA在InitA()中将回调函数注册到Openssl中 #2。 在调用libA API之前,projB在初始化时将回调函数注册到Openssl中,并且libA不进行回调注册 对于解决方案#1,libA本身是线程安全的,关于调用Openssl API。 但是,projB还必须确保其线程安全性,并且它将采取类似的操作将回调函数注册到Openssl中。 假设libA注册以下回调函数 void ssl_locking_function_A(int mode,int n,const char * file,int line) […]

想要使用g_timeout_add。 必须运行glib主循环?

我正在尝试使用g_timeout_add(timevalue,Func,在Func中传递的值)添加回调以获取某些状态或在timevalue之后打印一些内容。 我无法看到它。 我还要调用主循环吗? 或任何其他类型的function,以使其工作?

我可以从旧版C回调中抛出C ++exception吗?

我有使用一些C库的C ++代码。 C库采用C语言回调。 我在我的C ++代码中编写了一个回调函数,现在我不知何故需要报告错误(但它返回void)。 我想知道我是否可以从C ++代码中使用的C回调中抛出exception? 这对我来说很难理解。 谢谢,Boda Cydo。

尝试从C调用Python函数时的Segfault

所以,我想从C调用一个Python回调函数。 在某些时候,函数被发送到C并打包成这样的元组 PyObject *userData = Py_BuildValue(“Oi”,py_callback,some_number); 在那个区域的某个地方,我也做了Py_INCREF(py_callback) 。 在程序的某个稍后时间,我想调用该函数 PyObject *py_callback; int some_number; PyArg_ParseTuple((PyObject*)userData,”Oi”,&py_callback,&some_number); // returns true PyObject *py_result = PyObject_CallFunctionObjArgs(py_callback, /* … */ NULL); 并且最后一次调用会引发分段错误。 你有什么想法,为什么会做这样的事情?

回调函数:void(* func)(int)和void(func)(int)之间的区别

所以让我说我有一个function: void foo (int i){ cout << "argument is: " << i << endl; } 我将此function传递给: void function1 (void(callback)(int), int arg){ callback(arg); } void function2 (void(*callback)(int), int arg){ callback(arg); } 这两个function是否相同? 这两者有什么区别吗?