Python
调用
windows
下
DLL
详解
- ctypes
库的使用
分类:
Python 2008-10-14 19:19 17710
人阅读
评论
(12)
收藏
举报
pythondllwindowsstructurecclass
作者:童磊(
magictong
)
P
.S.
之前的排版乱掉了,这里做一下排版,顺便改一下里面的一些用词错误。
2011-08-04
在
python
中某些时候需要
C
做效率上的补充,在实际应用中,需要做部分数据的交互。使
用
python
中的
ctypes
模块可以很方便的调用
windows
的
dll
(也包括
linux
下的
so
等文件)
,
下面将详细的讲解这个模块(以
windows
平台为例子)
,当然我假设你们已经对
windows
下
怎么写一个
DLL
是没有问题的。
引入
ctypes
库
[python] view plaincopyprint?
from ctypes import *
from ctypes import *
假设你已经有了一个的
DLL
(名字是
add.dll)
,且该
DLL
有一个符合
cdecl
(这里强调调用约
定是因为,
stdcall
调用约定和
cdecl
调用约定声明的导出函数,
在使用
python
加载时使用的
加载函数是不同的,后面会有说明)调用约定的导出函数
Add
。
建立一个
Python
文件
DllCall.py
测试:
[python] view plaincopyprint?
from ctypes import *
dll = CDLL("add.dll")
print dll.Add(1, 102)
from ctypes import *
dll = CDLL("add.dll")
print dll.Add(1, 102)
结果:
103
上面是一个简单的例子。下面简单聊一下调用流程:
1
、加载
DLL
上面已经说过,加载的时候要根据你将要调用的函数是符合什么调用约定的。
stdcall
调用约定:两种加载方式
[python] view plaincopyprint?
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl
调用约定:也有两种加载方式
[python] view plaincopyprint?
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
其实
windll
和
cdll
分别是
WinDLL
类和
CDll
类的