最近研究这个,准备在新部门里大用Python了
首先用VC建立一个试验用的DLL。
假设函数的参数是这样的
typedef
struct
_TASK_PARAM
... {
int nTaskPriority;
int nMaxNum;
CHAR szContent[512];
_TASK_PARAM::_TASK_PARAM()
...{
ZeroMemory(this, sizeof(*this));
}
} TASK_PARAM, * PTASK_PARAM;
typedef CONST TASK_PARAM * PCTASK_PARAM;
... {
int nTaskPriority;
int nMaxNum;
CHAR szContent[512];
_TASK_PARAM::_TASK_PARAM()
...{
ZeroMemory(this, sizeof(*this));
}
} TASK_PARAM, * PTASK_PARAM;
typedef CONST TASK_PARAM * PCTASK_PARAM;
函数如下:
extern
"
C
"
int
Test(PCTASK_PARAM para)
... {
printf ("nTaskPriority=%d, nMaxNum=%d, szContent=%s",para->nTaskPriority,para->nMaxNum,para->szContent);
return para->nTaskPriority;
}
... {
printf ("nTaskPriority=%d, nMaxNum=%d, szContent=%s",para->nTaskPriority,para->nMaxNum,para->szContent);
return para->nTaskPriority;
}
Python里首先这样声明对应的对象:
class
TASK_PARAM(Structure):
_fields_ = [ ( " nTaskPriority " , c_int),
( " nMaxNum " , c_int),
( " szContent " , c_char * 512 )]
_fields_ = [ ( " nTaskPriority " , c_int),
( " nMaxNum " , c_int),
( " szContent " , c_char * 512 )]
然后这样调用:
cdll.LoadLibrary(
"
C:/tjDll.dll
"
);
para = TASK_PARAM();
para.nTaskPriority = 1 ;
para.nMaxNum = 2 ;
para.szNotifyContent = '中文/0';
print para.szNotifyContent
cdll.tjDll.Test(byref(para));
para = TASK_PARAM();
para.nTaskPriority = 1 ;
para.nMaxNum = 2 ;
para.szNotifyContent = '中文/0';
print para.szNotifyContent
cdll.tjDll.Test(byref(para));
如果VC的函数里要修改Python传入的参数,例如:
extern
"
C
"
int
TestIntRef(
int
*
para)
... {
*para = *para + 1;
return *para;
}
... {
*para = *para + 1;
return *para;
}
Python里就这么玩:
intPara
=
c_int(
9
)
print cdll.tjDll.TestIntRef(byref(intPara));
print intPara.value;
print cdll.tjDll.TestIntRef(byref(intPara));
print intPara.value;
对于这种要修改字符串的:
extern
"
C
"
int
TestCharRef(
char
*
para)
... {
strcpy(para, "char* test.");
return 2;
}
... {
strcpy(para, "char* test.");
return 2;
}
也不在话下:
szPara = create_string_buffer('/0' * 64)
print cdll.tjDll.TestCharRef(byref(szPara));
print szPara.value;
print cdll.tjDll.TestCharRef(byref(szPara));
print szPara.value;
都是从Python的ctypes的教程看来的。之前要from ctypes import*,好玩