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:使用ctypes库调用外部DLL(附带ctypes c 类型转换图)

2010-04-04 23:36 by 无常, 22558 阅读, 6 评论, 收藏, 编辑 前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接。看...

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

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

使用c写python的模块和python调用系统dll

python总是和c连接最紧密,因为python本身就是用c写的。python用c进行扩展模块也很容易和高效。 使用c写python的模块,首先要引入Python.h头文件,并且一些数据类型和要是用...
  • sujudz
  • sujudz
  • 2013年03月29日 18:12
  • 728

如何使用C/C++为Python编写DLL/SO

开门见山,直接阐述步骤。1. 新建一个源码文件,里面包含了返回两个整数的和的函数如果使用C语言,新建test.c文件,并输入以下内容:// test.c __declspec(dllexport) ...
  • lihao21
  • lihao21
  • 2015年06月24日 15:18
  • 3482

ctypes库的使用 python调用Windows DLL

  • 2011年12月04日 12:58
  • 127KB
  • 下载

Java框架JNA调用C方法(windows链接库dll文件、linux链接库so文件)

介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA。 JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一...

C#调用C的Dll(类型对照)

转: C#调用C的Dll(类型对照) //C++中的DLL函数原型为   //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1...

Unity3d中调用C/C++封装的DLL

Step1:创建动态链接库(DLL) 1.  打开VS2013,创建一个Win32应用程序,命名为U3DDLL 创建Win32应用程序 点击下一步 2.  选择应用程序类型为DLL的空项目...
  • wuquanl
  • wuquanl
  • 2017年05月14日 19:00
  • 1129

C#调用C/C++ 动态链接库DLL(三)

2。 在C#中创建DLL接口的声明 C#没有全局函数,必须使用静态函数实现全局函数。 1)  DllImport类似C++中的__declspec(dllimport),第一个参数为必选参数,为D...
  • Nocky
  • Nocky
  • 2012年06月24日 15:24
  • 16039

java调用c dll,指针参数和结构体参数搞定

基于上两篇java调用dll的文章,我做了更为复杂的参数传递,指针变量和结构体变量,下面给出源码 vc++中的工程名称是SMSXIAO Source Files(源文件):.c文件名:sms.c ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python调用C的DLL
举报原因:
原因补充:

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