首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python和ctype:如何正确地将“指针到指针”传递到DLL?

Python和ctype:如何正确地将“指针到指针”传递到DLL?
EN

Stack Overflow用户
提问于 2010-11-18 17:02:25
回答 1查看 26.9K关注 0票数 25

我有一个分配内存并返回内存的DLL。DLL中的函数如下所示:

代码语言:javascript
复制
void Foo( unsigned char** ppMem, int* pSize )
{
  * pSize = 4;
  * ppMem = malloc( * pSize );
  for( int i = 0; i < * pSize; i ++ ) (* ppMem)[ i ] = i;
}

另外,我有一段python代码,可以从我的DLL访问这个函数:

代码语言:javascript
复制
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”O_O。有什么提示我做错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-19 02:51:22

发布实际的代码。C/C++代码不能编译为C或C++。Python代码有语法错误(]结束函数调用Foo)。下面的代码可以正常工作。修复语法和编译器错误后的主要问题是声明函数__stdcall,以便可以在Python代码中使用windll。另一种选择是在__cdecl代码中使用cdll而不是windll (通常是默认设置)。

C (cl /W4 /LD mydll.c)

代码语言:javascript
复制
#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 (兼容Python2/3和32/64位)

代码语言:javascript
复制
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])

输出

代码语言:javascript
复制
4 0 1 2 3
票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4213095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档