py 回调
1、
#include "stdafx.h" #include <stdio.h> #define DLLEXPORT extern "C" __declspec(dllexport) //放在 #include "stdafx.h" 之后 typedef void(__stdcall *FUNCTION2)(int * item); DLLEXPORT void __stdcall testCalBack3(FUNCTION2 callBack) { //unsigned char *strp =(unsigned char *)&str; //out[0] = (unsigned char*)'c'; int b = 98; int *a = &b; callBack(a); printf("pp:%d", *a); //callBack(1, (unsigned char *)"ok"); }
callback_type1 = WINFUNCTYPE(c_void_p,POINTER(c_int)) def callback_func1( p1): print('',p1) print('p1[0]',p1[0]) p1[0]=77 print('p1[0]',p1[0]) callable_ptr1 = callback_type1(callback_func1) res = pDll.testCalBack3(callable_ptr1)
2、指针的指针
typedef void(__stdcall *FUNCTION4)(int ** item); DLLEXPORT void __stdcall testCalBack4(FUNCTION4 callBack) { //unsigned char *strp =(unsigned char *)&str; //out[0] = (unsigned char*)'c'; int b = 98; int *a = &b; int **c = &a; callBack(c); printf("pp:%d", **c); //callBack(1, (unsigned char *)"ok"); }
callback_type4 = WINFUNCTYPE(c_void_p,POINTER(POINTER(c_int))) def callback_func4( p1): print('',p1) print('p1[0]',p1[0]) print('p1[0][0]',p1[0][0]) p1[0][0]=88 print('p1[0]',p1[0]) print('p1[0][0]',p1[0][0]) callable_ptr1 = callback_type4(callback_func4) res = pDll.testCalBack4(callable_ptr1)
3、char
typedef void(__stdcall *FUNCTION5)(char * item); DLLEXPORT void __stdcall testCalBack5(FUNCTION5 callBack) { //unsigned char *strp =(unsigned char *)&str; //out[0] = (unsigned char*)'c'; char b = 'a'; char *a = &b; callBack(a); printf("pp:%c", *a); //callBack(1, (unsigned char *)"ok"); } typedef void(__stdcall *FUNCTION6)(char ** item); DLLEXPORT void __stdcall testCalBack6(FUNCTION6 callBack) { //unsigned char *strp =(unsigned char *)&str; //out[0] = (unsigned char*)'c'; char b = 'a'; char *a = &b; char **c = &a; callBack(c); printf("pp:%c", **c); //callBack(1, (unsigned char *)"ok"); }
callback_type5 = WINFUNCTYPE(c_void_p,POINTER(c_char)) def callback_func5( p1): print('',p1) print('p1[0]',p1[0]) p1[0]=c_char(b"C") print('p1[0]',p1[0]) callable_ptr5 = callback_type5(callback_func5) res = pDll.testCalBack5(callable_ptr5) callback_type6 = WINFUNCTYPE(c_void_p,POINTER(POINTER(c_char))) def callback_func6( p1): print('',p1) print('p1[0]',p1[0]) print('p1[0][0]',p1[0][0]) p1[0][0]=c_char(b"D") print('p1[0]',p1[0]) print('p1[0][0]',p1[0][0]) callable_ptr6 = callback_type6(callback_func6) res = pDll.testCalBack6(callable_ptr6)
4.
typedef void(__stdcall *FUNCTION7)(char ** item); DLLEXPORT void __stdcall testCalBack7(FUNCTION7 callBack) { //unsigned char *strp =(unsigned char *)&str; //out[0] = (unsigned char*)'c'; char b[512];// = 'a'; strcpy_s(b,6 ,"test1"); char *a = b; char **c = &a; callBack(c); printf("pp:%s",(char*) *c); //callBack(1, (unsigned char *)"ok"); }
print('before callback_func7') mstr = 'Hello world' buf = create_string_buffer(mstr.encode('ascii')) callback_type7 = WINFUNCTYPE(c_void_p,POINTER(POINTER(c_char))) def callback_func7( p1): print('callback_func7',p1) print('p1[0]',p1[0]) print('p1[0][0]',p1[0][0]) #p1[0][0]=c_char(b"D") memmove(p1[0], buf , 5) print('p1[0]',p1[0]) print('p1[0][0]',p1[0][0]) callable_ptr7 = callback_type7(callback_func7) res = pDll.testCalBack7(callable_ptr7) print(5)
6、yh最终版
callback_typeYh = WINFUNCTYPE(c_void_p,c_char_p,POINTER(POINTER(c_char))) def callback_funcYh(p1,pp2): #str=p2.decode('gbk')+','+p3.decode('gbk')+','+p4.decode('gbk') #print(p1,p2,p3,p4,p5) print(p1.decode('gbk')) strTmp1 = '{"ExcuteRet":"true","Value":"ext connect pass:COM5"}' #buf = create_string_buffer(strTmp1,"utf8") buf = create_string_buffer(strTmp1.encode('utf8')) strp = cast(buf,POINTER(c_char)) #print(strp) #bufp = byref(buf) #pp2=strpp print(pp2,pp2[0]) pp2[0] = (strp) #pp2[0] = c_char_p(strp) #memmove(pp2[0], buf , len(buf)) print(buf.value) #print(pp2.decode('gbk'),pp2[0].decode('gbk'),pp2.contents.decode('gbk')) callable_ptrYh = callback_typeYh(callback_funcYh) res = pDll.ConfigYH(callable_ptrYh)