关闭

Python调用C的DLL

2877人阅读 评论(1) 收藏 举报

最近研究这个,准备在新部门里大用Python了

首先用VC建立一个试验用的DLL。

假设函数的参数是这样的

typedef struct _TASK_PARAM
{
    
int    nTaskPriority;
    
int    nMaxNum; 
    CHAR   szContent[
512];  

    _TASK_PARAM::_TASK_PARAM()
    
{
        ZeroMemory(
thissizeof(*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;

 

都是从Python的ctypes的教程看来的。之前要from ctypes import*,好玩

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:115913次
    • 积分:1916
    • 等级:
    • 排名:千里之外
    • 原创:70篇
    • 转载:1篇
    • 译文:1篇
    • 评论:30条
    文章分类
    最新评论