Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过python ctypes将二进制缓冲区传递给c函数_Python_Wrapper_Ctypes - Fatal编程技术网

如何通过python ctypes将二进制缓冲区传递给c函数

如何通过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

我想在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 (%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)