python调用dll

作者:原创时间:2022-03-11
文档

python调用dll怎么操作?一起来看看小编今天的分享吧!

python调用dll有两个方法,一是通过ctypes.windll.LoadLibrary()调用,二是通过ctypes.WinDll()调用。

例如假设我们存在一个test.dll文件:

extern   " C "
{
 
int  __stdcall test(  void *  p,  int  len)
{
      return  len;
}
 
}

方法一:

import  ctypes
dll  =  ctypes.windll.LoadLibrary(  ' test.dll '  )

方法二:

import  ctypes
dll  =  ctypes.WinDll(  ' test.dll '  )

其中ctypes.windll为ctypes.WinDll类的一个对象,已经在ctypes模块中定义好的。在test.dll中有test接口,可直接用dll调用即可。

nRst  =  dll.test( )
print  nRst

由于在test这个接口中需要传递两个参数,一个是void类型的指针,它指向一个缓冲区,一个是该缓冲区的长度。因此我们要获取到python中的字符串的指针和长度。

#方法一:
sBuf  =   ' aaaaaaaaaabbbbbbbbbbbbbb '
pStr  =  ctypes.c_char_p( )
pStr.value  =  sBuf
pVoid  =  ctypes.cast( pStr, ctypes.c_void_p ).value
nRst  =  dll.test( pVoid, len( pStr.value) )
#方法二:
test  = dll.test
test.argtypes = [ctypes.c_char_p, ctypes.c_int]
test.restypes = ctypes.c_int
nRst = test(sBuf, len(sBuf))

如果修改test.dll中接口的定义如下:

extern   " C "
{
     int  __cdecl test(  void *  p,  int  len)
    {
         return  len;
    }
}

由于接口中定义的是cdecl格式的调用,所以在python中也需要用相应的类型:

1 .
import  ctypes
dll  =  ctypes.cdll.LoadLibrary(  ' test.dll '  )
##注:一般在linux下为test.o文件,同样可以使用如下的方法:
## dll = ctypes.cdll.LoadLibrary('test.o')
2 .
import  ctypes
dll  =  ctypes.CDll(  ' test.dll '  )

以上就是小编今天的分享了,希望可以帮助到大家。

显示全文
java concat js 遍历json js json对象 js数组遍历方法 python 引用 idea的maven配置 maven安装配置 java filereader java stream java random java lambda java hashmap java foreach java final java json java 泛型 python range函数 linux ftp js 字符串转数字 电脑忘记开机密码怎么办 python strip函数 python configparser模块 oracle coalesce rstudio使用教程 mysql去重复 保留一条 js set方法 python中get函数用法 java get和set方法 object转bigdecimal object 转list python 交集 js读取文件 linux 格式化u盘 deque java java process armoury crate打不开 python skimage vue使用jquery js set去重 python的range函数用法