Python调用C的DLL

原创 2007年09月26日 11:36:00

最近研究这个,准备在新部门里大用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*,好玩

Python调用C/C++动态链接库

吐槽(可略过):不知不觉,4月份毕业,5月份进入团队,已有7个月。大的方面经历着测试、解决客户问题/bug、出一个产品Patch,小的技术方面经历着C++,Shell,python,linux Ker...
  • CJF_iceKing
  • CJF_iceKing
  • 2013年12月04日 16:39
  • 26562

python 3 调用c/c++ 动态链接库 *.dll

首先,创建动态链接库(一个简单的北斗数据处理接口,为简化处理,实现部分直接返回值),代码如下: #ifndef _pro_header_2014_ #define _pro_header_2014_ ...
  • iceboy314159
  • iceboy314159
  • 2016年11月16日 21:44
  • 2614

python调用C动态库导出函数的返回值为指针类型时,在64位python环境下被截断解决方法

2015年8月20日 16:57:11      又为一个问题浪费了两天的时间:      问题描述如下:染色日志库通过ctype导入,在64位的linux系统中只有主线程能正常使用,子线程创建日...
  • jince007
  • jince007
  • 2015年08月20日 17:32
  • 1573

ubuntu下python调用C/C++方法之动态链接库

安装boost python调用C/C++的方法有很多,本文使用boost.python。考虑到后期有好多在boost上的开发工作,所以boost一并安装了 具体安装方法可以参考:http://blo...
  • qq_36323886
  • qq_36323886
  • 2017年04月15日 22:27
  • 181

python调用dll动态库传入结构体作为参数

test.h中定义结构体 test.h #include #include #define ARRAY_NUMBER 20 #define STR_LEN 20 ...
  • youyudexiaowangzi
  • youyudexiaowangzi
  • 2016年12月17日 11:57
  • 1619

Python 调用 C 语言的简单流程(一)

在python中调用dll文件,实例代码如下: 1:建立C语言文件,假如名字叫做dlltest.c: #include "stdlib.h" __declspec(dllexport) int _...
  • olenet
  • olenet
  • 2014年03月06日 20:05
  • 1031

生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)

首先,dll工程的创建以及dll文件的生成:
  • xiuduyi
  • xiuduyi
  • 2014年09月27日 09:36
  • 2896

Python调用C/C++互相调用

一、问题       Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结。 二、Python调用C/C++ 1、Python...
  • wuchuanpingstone
  • wuchuanpingstone
  • 2017年09月01日 09:08
  • 721

c调用c++编的dll,c++调用c编写的dll,extern “C”的用法

c和c++不能直接相互调用,主要是因为c++有重载函数的功能,为了区分重载函数,编译器会在函数名上加上一些修饰用符号,而c不这么做。为了让c与c++的程序能够相互调用对方的库,就有了extern “C...
  • life_is_too_hard
  • life_is_too_hard
  • 2016年08月06日 18:05
  • 1242

vs2010编写dll库供python使用

刚接触这个问题的时候在网上也是搜罗了一大堆,大多数做下来没有成功,原因未知,很可能是我的功底不够吧,这里记录一下我成功的demo,希望能版主其他人。首先就是使用vs2010创建一个dll库(空项目)的...
  • Eric_lmy
  • Eric_lmy
  • 2017年04月11日 13:33
  • 738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python调用C的DLL
举报原因:
原因补充:

(最多只允许输入30个字)