我有一个DLL分配内存并返回它.DLL中的函数是这样的:
void Foo( unsigned char** ppMem, int* pSize )
{
* pSize = 4;
* ppMem = malloc( * pSize );
for( int i = 0; i < * pSize; i ++ ) (* ppMem)[ i ] = i;
}
Run Code Online (Sandbox Code Playgroud)
另外,我有一个从我的DLL访问此函数的python代码:
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 ]
Run Code Online (Sandbox Code Playgroud)
我期待它print会显示"4 0 1 2 3",但它显示"4 221 221 221 221"O_O.什么提示我做错了什么?
Mar*_*nen 27
发布实际代码.C/C++代码不能编译为C或C++.Python代码有语法错误(]结束函数调用Foo).以下代码有效.修复语法和编译器错误后的主要问题是声明函数,__stdcall因此windll可以在Python代码中使用.另一种选择是使用__cdecl(通常是默认值)并使用cdll而不是windll在Python代码中.
#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;
}
Run Code Online (Sandbox Code Playgroud)
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.value,mem[0],mem[1],mem[2],mem[3]
Run Code Online (Sandbox Code Playgroud)
4 0 1 2 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21811 次 |
| 最近记录: |