如何通过python ctypes将二进制缓冲区传递给c函数
我想在Python2.x中包装以下c函数bar()并调用 它通过Linux和Windows上的ctypes模块:如何通过python ctypes将二进制缓冲区传递给c函数,python,wrapper,ctypes,Python,Wrapper,Ctypes,我想在Python2.x中包装以下c函数bar()并调用 它通过Linux和Windows上的ctypes模块: #include <stdio.h> #ifdef FOO_DLL #define FOO_API __declspec(dllexport) #else #define FOO_API extern #endif FOO_API unsigned int bar(const void* data, unsigned int len) { printf("%p
#include <stdio.h>
#ifdef FOO_DLL
#define FOO_API __declspec(dllexport)
#else
#define FOO_API extern
#endif
FOO_API unsigned int bar(const void* data, unsigned int len)
{
printf("%p (%d bytes)\n", data, len);
return len;
}
最后,我加载相应的共享库并调用函数:
import sys
import struct
from ctypes import *
if sys.platform == 'win32':
libfoo = windll.LoadLibrary('foo')
else:
libfoo = cdll.LoadLibrary('./libfoo.so')
data = struct.pack('BBB', 0, 1, 2)
libfoo.bar(data, len(data))
令我惊讶的是,这在Linux下似乎可以完美地工作,但在Windows上却是如此
代码抛出一个错误,使我怀疑这是不正确的
做事的方式:
$ python foo.py
00B520C4 (3 bytes)
Traceback (most recent call last):
File "foo.py", line 11, in <module>
libfoo.bar(data, len(data))
ValueError: Procedure probably called with too many arguments (8 bytes in excess)
$python foo.py
00B520C4(3字节)
回溯(最近一次呼叫最后一次):
文件“foo.py”,第11行,在
libfoo.bar(数据,len(数据))
ValueError:调用过程的参数可能太多(超过8字节)
正确的方法是什么
在Linux(Ubuntu 10.10 64位)上,我使用的是Python 2.6.6、gcc 4.4.5,在Windows(XP 32位,在VirtualBox中)上使用的是Python 2.7.1和VS2010 Express。Windows和Linux都应该使用
cdll
,这导致了C调用约定。Python代码目前使用stdcall
调用Windows DLL,但它实际上是一个cdecl
函数。cdll
和windl
之间的区别只是所使用的调用约定
该错误消息是一个教科书式的调用约定不匹配错误,值得一提。好的,谢谢。不知何故,我认为在windows上我应该使用Windell。愚蠢的我。对win32部件使用“libfoo=cdll.LoadLibrary('foo')”可以完美地工作。
$ python foo.py
00B520C4 (3 bytes)
Traceback (most recent call last):
File "foo.py", line 11, in <module>
libfoo.bar(data, len(data))
ValueError: Procedure probably called with too many arguments (8 bytes in excess)