<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="Python使用ctypes调用DLL中的函数" id="card1">
<p> 游客</p><p>
标题:Python使用ctypes调用DLL中的函数<br/>
正文:<br/>
在python中调用dll文件中的接口比较简单，实例代码如下。__stdcall 模式 DLL如我们有一个test.dll文件，内部定义如下：extern &quot;C&quot;<br/>{<br/> <br/>int __stdcall test( void* p, int len)<br/>{<br/>     return len;<br/>}<br/> <br/>}在python中我们可以用以下两种方式载入方法一：import ctypes<br/>dll = ctypes.windll.LoadLibrary( ’test.dll’ )方法二：import ctypes<br/>dll = ctypes.WinDll( ’test.dll’ )其中ctypes.windll为ctypes.WinDll类的一个对象，已经在ctypes模块中定义好的。在test.dll中有test接口，可直接用dll调用即可nRst = dll.test( )<br/>print nRst由于在test这个接口中需要传递两个参数，一个是void类型的指针，它指向一个缓冲区。一个是该缓冲区的长度。因此我们要获取到python中的字符串的指针和长度#方法一：sBuf = ’aaaaaaaaaabbbbbbbbbbbbbb’<br/>pStr = ctypes.c_char_p( )<br/>pStr.value = sBuf<br/>pVoid = ctypes.cast( pStr, ctypes.c_void_p ).value<br/>nRst = dll.test( pVoid, len( pStr.value) )#方法二：test  = dll.test<br/>test.argtypes = [ctypes.c_char_p, ctypes.c_int]<br/>test.restypes = ctypes.c_int<br/>nRst = test(sBuf, len(sBuf))__cdecl 模式 DLL如果修改test.dll中接口的定义如下：extern &quot;C&quot;<br/>{<br/>    int __cdecl test( void* p, int len)<br/>    {<br/>        return len;<br/>    }<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=528&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=528&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=528&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=528&amp;Page=2">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=528">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=528">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>