Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl调用约定:也有两种加载方式
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
其实windll和cdll分别是WinDLL类和CDll类的对象。
3. 调用DLL方法
加载dll后会返回一个DLL对象,使用其中的函数方法则相当于操作该对象的对应属性。
注意,经过stdcall声明的方法,如果不是用def文件声明的导出函数或者extern “C” 声明的话,编译器会对函数名进行修改
函数参数申明,通过设置函数的argtypes属性
函数返回类型,函数默认返回c_int类型,如果需要返回其他类型,需要设置函数的restype属性
4. 指针与引用
常用的通过调用ctypes类型的指针函数来创建指针实例:
from ctype import *
i = c_int(1)
pi = POINTER(i)
对指针实例赋值只会改变其指向的内存地址,而不是改变内存的内容,与其他语言类似,如需要可改变内容的字符串,可须使用create_string_buffer()
>>> p = create_string_buffer("Hello", 10) # create a 10 byte buffer
>>> print sizeof(p), repr(p.raw)
10 'Hello/x00/x00/x00/x00/x00'
不带参数的调用指针类型创建一个NULL指针, NULL指针有一个False布尔值
>>> null_ptr = POINTER(c_int)()
>>> print bool(null_ptr)
False
指针实例有一个contents属性,返回这个指针所指向的对象。
另外,byref()是用来传递引用参数,pointer()作为传参通常会创建一个实际的指针对象,当不需要实际指针对象时,则可使用byref()
5. 结构体类型处理
Structures和Unions必须继承Structure和Union基础类,它们都在ctypes模块中定义,每一个子类必须定义个_fields_属性,_fields_是一个二维的tuples列表,包含着每个field的name及type,这field类型必须是一个ctypes类型,如c_int,或者任何其他的继承ctypes的类型,如Structure, Union, Array, 指针等。
例如有一个简单结构,包含两个整型x和y,可如下初始化一个结构:
from ctypes import *
import types
class Test(Structure):
_fields_ = [('x', c_int),
('y', c_char)]
test1 = Test(1, 2)
另外,如结构体用于链表操作,即包含指向结构体指针时,若直接定义:
from ctypes import *
import types
class Test(Structure):
_fields_ = [('x', c_int),
('y', c_char),
('next', Test)]
则python会报错type未定义,:
from ctypes import *
import types
class Test(Structure):
Test._fields_ = [('x', c_int),
('y', c_char),
('next', POINTER(Test))]
6. 数组定义
数组包含一个固定数目的相同类型的实例,常用创建数组类型是对一个数据类型与一个正数相乘,例如:
ArrayType = Test * 10
初始化和使用数组:
>>> from ctypes import *
>>> TenIntegers = c_int * 10
>>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> print ii
<c_long_Array_10 object at 0x...>
>>> for i in ii: print i,
7. 回调函数
ctypes可以从python可调用对象中创建一个c可调用的函数指针,这些通常被称为回调函数。
(这个等用到时,再仔细研究。。。)
Python 和 C 的混合编程工具有很多,这里介绍 Python 标准库自带的 ctypes 模块的使用方法。
初识Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库的形式,即 Windows 下的 .dll 文件,或者 Linux 下的 .so 文件。
来看一下 ctypes 怎么使用 C 标准库。Wind...
https://docs.python.org/2/library/ctypes.html
http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/
官方说法:允许py...
Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库的形式,即 Windows 下的 .dll 文件,或者 Linux 下的 .so 文件。先来看一下 ctypes 怎么使用 C 标准库。
Windows 系统下的 C 标...
1 简介
ctypes是一个自Python 2.5开始引入的,Python自带的函数库。其提供了一系列与C、C++语言兼容的数据结构类与方法,可基于由C源代码编译而来的DLL动态链接库文件,进行Python程序与C程序之间的数据交换与相互调用。
2 基于GCC的DLL/SO动态链接库的编译本文使用gcc/g++编译器进行C源代码的编译操作。
当需要使用gcc进行dll动态链接库文件(Linux...
ctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用DLL中输出的C接口函数。
1.加载dll和取出函数
from ctypes import *
dll = cdll.LoadLibrary(dllpath) #dllpath是字符串
dll = windll.LoadLibrary(dllpath)
上面两行使用哪一行,取决于导出函数的调用规范(cdecl或stdcall).也可以使用下面两行代替:
dll = CDLL(dllpath) #注意和上面大
一. ctypes使用介绍
ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。这篇文章主要是介绍如何使用ctypes模块对C语言编译的动态链接库要求的数据类型进行封装,主要包括以下几类:
C语言中基础的数据类型(如char, int等)
结构体类型
嵌套结构体
结构体数组
结构体指针