// c 程序 段 static PyObject *gc_before_extract = NULL; /// 设置回调 static PyObject * SetBeforeCallbackFn(PyObject *dummy, PyObject *args) { PyObject *temp = NULL; if (PyArg_ParseTuple(args, "O:set_callback", &temp)) { if (!PyCallable_Check(temp)) { PyErr_SetString(PyExc_TypeError, "parameter must be callable"); } Py_XINCREF(temp); /* Add a reference to new callback */ Py_XDECREF(gc_before_extract); /* Dispose of previous callback */ gc_before_extract = temp; /* Remember new callback */ } return Py_BuildValue("l", (gc_before_extract == NULL) ? 0 : 1); } /// 调用上面函数设置的python脚本函数 int BeforeExt(char *pBeforeExtract) { PyObject* pArgs = NULL; PyObject* pRetVal = NULL; int nRetVal = 0; pArgs = Py_BuildValue("(s)", pFileName); pRetVal = PyEval_CallObject(gc_before_extract, pArgs); if (pRetVal) { fprintf(stderr, "PyEval_CallObject : ok /r/n"); nRetVal = PyInt_AsLong(pRetVal); fprintf(stderr, "PyEval_CallObject : return : %d /r/n", nRetVal); } Py_DECREF(pArgs); Py_DECREF(pRetVal); return nRetVal; } /// 测试函数 static PyObject* my_test_callback(PyObject *self, PyObject *args) { PyObject * arglist; PyObject * result = NULL; BeforeExt("good"); result = PyEval_CallObject(gc_before_extract, args); if (result) { Py_DECREF(result); } Py_INCREF(Py_None); return Py_None; }
/////// python 脚本 from pyArchive import * from ctypes import * # 回调函数必须有一个int型的返回值 def set_callback_fn(abc) : print "t_callback_fn say : {0}".format(abc) return 11 CMPFUNC = CFUNCTYPE(c_int, c_char_p) _callback = CMPFUNC(set_callback_fn) if SetBeforeCallbackFn(_callback): print "set call back ok" my_test_callback("script call : good luck") else : print "set call back fail"
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/8507.html