最近研究这个,准备在新部门里大用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;
函数如下:
extern
"
C
"
int
Test(PCTASK_PARAM para)
...
{
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
)]
然后这样调用:
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));
如果VC的函数里要修改Python传入的参数,例如:
extern
"
C
"
int
TestIntRef(
int
*
para)
...
{
*para = *para + 1;
return *para;
}
Python里就这么玩:
intPara
=
c_int(
9
)
print
cdll.tjDll.TestIntRef(byref(intPara));
print
intPara.value;
对于这种要修改字符串的:
extern
"
C
"
int
TestCharRef(
char
*
para)
...
{
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*,好玩
本文介绍如何使用Python的ctypes库来调用C语言编写的DLL文件,并展示了如何处理不同类型的数据传递,包括基本类型、结构体及引用类型的修改。
3726

被折叠的 条评论
为什么被折叠?



