我有一个 DLL,它分配内存并返回它。 DLL中的函数如下:
void Foo( unsigned char** ppMem, int* pSize )
{
* pSize = 4;
* ppMem = malloc( * pSize );
for( int i = 0; i < * pSize; i ++ ) (* ppMem)[ i ] = i;
}
另外,我有一个 python 代码可以从我的 DLL 访问这个函数:
from ctypes import *
Foo = windll.mydll.Foo
Foo.argtypes = [ POINTER( POINTER( c_ubyte ) ), POINTER( c_int ) ]
mem = POINTER( c_ubyte )()
size = c_int( 0 )
Foo( byref( mem ), byref( size ) ]
print size, mem[ 0 ], mem[ 1 ], mem[ 2 ], mem[ 3 ]
我期待着print
将显示“4 0 1 2 3”,但显示“4 221 221 221 221”O_O。有任何提示我做错了什么吗?
发布实际代码。 C/C++ 代码不能编译为 C 或 C++。 Python 代码存在语法错误(] 结束函数调用 Foo)。下面的代码有效。修复语法和编译器错误后的主要问题是声明函数__stdcall
so windll
可以在Python代码中使用。另一种选择是使用__cdecl
(通常是默认值)并使用cdll
代替windll
在Python代码中。
mydll.c (cl /W4 /LD mydll.c)
#include <stdlib.h>
__declspec(dllexport) void __stdcall Foo(unsigned char** ppMem, int* pSize)
{
char i;
*pSize = 4;
*ppMem = malloc(*pSize);
for(i = 0; i < *pSize; i++)
(*ppMem)[i] = i;
}
demo.py(Python 2/3 和 32-/64 位兼容)
from __future__ import print_function
from ctypes import *
Foo = WinDLL('./mydll').Foo
Foo.argtypes = POINTER(POINTER(c_ubyte)), POINTER(c_int)
Foo.restype = None
mem = POINTER(c_ubyte)()
size = c_int()
Foo(byref(mem),byref(size))
print(size.value, mem[0], mem[1], mem[2], mem[3])
Output
4 0 1 2 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)