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

2024-01-21

我有一个 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(使用前将#替换为@)

Python 和 ctypes:如何正确地将“指针到指针”传递到 DLL 中? 的相关文章

随机推荐

  • 铯标签模糊

    我使用以下代码创建了一个 Cesium 标签 var label Cesium LabelGraphics new Cesium LabelGraphics text lab verticalOrigin Cesium VerticalOr
  • 对于 Int32 来说值太大或太小 - Facebook 和 dotnetopenauth

    我正在尝试获取一个与 dotnetopenauth 和 facebook 一起使用的示例项目 我有这个代码 namespace OAuthClient using System using System Configuration usin
  • 使用聚合函数和 SELECT 进行更新

    我正在尝试编写一条 SQL 指令来更新与所有交货和订单总数相关的数据库库存产品数量 UPDATE tbl Product SET tbl Product Quantity Q Quantity FROM tbl Product INNER
  • CLR 内存不足异常

    我们遇到了很多内存不足的异常 但我们似乎无法诊断发生了什么 这似乎是一个在几分钟内内存使用量从 300 MB 飙升至超过 1 GB 的问题 现在这是一个IIS https en wikipedia org wiki Internet Inf
  • pandas agg 和 apply 函数有什么区别?

    我分不清熊猫之间的区别 aggregate and apply功能 以以下为例 我加载一个数据集 执行groupby 定义一个简单的函数 和任一用户 agg or apply 正如您所看到的 我的函数中的打印语句会产生相同的输出 使用后 a
  • 从C#中的角度计算圆圆周上的点?

    我想这是一个简单的问题 但我当前的代码得到了一些奇怪的结果 而且我没有数学背景来完全理解原因 我的目标很简单 如标题所示 我只想找到距中心点一定距离和角度的点 我当前的代码 Point centerPoint new Point 0 0 P
  • 将 MySQL 查询转换为 Codeigniter 语法

    我在将 MYSQL 查询转换为 CI 语法时遇到一些问题 这是我的 MySQL 语法 select a pbj name as NAMA PERUSAHAAN count a id pbj as JUMLAH PAKET group con
  • Clojure:懒惰魔法

    几乎 2 个相同的程序可以生成无限惰性的随机序列 第一个不会崩溃 第二次崩溃 出现 OutOfMemoryError 异常 为什么 Return infinite lazy sequence of random numbers defn i
  • 加盐你的密码:最佳实践? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我一直很好奇 对密码进行加盐以进行哈希处理时 前缀还是后缀哪个更好 为什么 或者只要你加盐就没关系吗 解释一下 我们现在 希望 都知道我们应该s
  • 在 IntelliJ Idea 中禁用代码折叠?

    如何在 IntelliJ idea 中禁用 或隐藏 这部分 Go to 文件 gt 设置 gt 编辑器 gt 常规 gt 代码折叠 Uncheck 显示代码折叠轮廓
  • 如何通过将所有选项放入 mongodb 的 Node.js 驱动程序的连接字符串中来连接 X509?

    我正在使用可用的密钥mongodb 文档 http mongodb github io node mongodb native 3 6 api MongoClient html使用带有 Node js 驱动程序的 X509 身份验证的自签名
  • 将 speedtest.net api 与 React Native 结合使用

    我正在创建一个 Android React Native 应用程序并尝试使用速度测试 net api https github com ddsol speedtest net获取移动设备的上传和下载速度 但是 当我尝试将库集成到 React
  • SQL Server 2008 中的检查约束

    拜托 我刚刚开始学习 SQL 并且陷入困境 我正在尝试为我的测试项目构建一个数据库 我创建了一些表 做了关系 定义了主键和外键 所有这些都在 SQL Server 2008 中通过可视化界面 表设计 编辑 没有声明编码 还没有到达那里 但我
  • 在 Sublime Text 中,如何查找和替换文件名

    在 Sublime Text 中有没有一种方法可以找到模式并将其替换为文件名 例如 我有一堆包含人物的文件名 我想用人来代替它 in SideBarEnhancements有一个选项Mass Rename Selection under F
  • Apache HTTP 连接与 Android 6.0 (Marshmallow)

    有没有办法将 Apache 库直接包含在 Gradle 中以使其与 Android 6 0 一起使用 我尝试包含这样的库 compile org apache httpcomponents httpcore 4 4 1 compile or
  • 代号一号如何运作?

    我正在寻找针对多个移动平台进行开发的替代方案 并发现代号一 http www codenameone com 使用 Java 作为通用语 而不是 HTML CSS JS 或脚本语言 我找不到的是它是如何工作的 它是否将 JVM 与 iOS
  • 使用 Google 跟踪代码管理器从 URL 中删除查询字符串

    我试图通过从 URL 中删除查询字符串来整理 Google Analytics 中的分析 但这分为三个要求 我想删除 GA 分析中显示的查询字符串 竞选 UTM 仍然需要发挥作用 阻止 UTM 中收集的任何 PII 攻击 GA 我发现了许多
  • 用于使用私有组件进行单元测试的 CocoaPods 项目结构

    我正在将 CocoaPods 用于具有以下结构的项目 Example Example PublicUmbrellaHeader h Example PrivateHeaderForComponent1 h Example PrivateHe
  • 使用 iText 自定义签名外观

    我正在尝试使用 iText sharp 版本 5 5 13 创建自定义数字签名 用户可以从一组四个位置 顶部 底部 左侧和右侧 设置图像位置 如下所示 Rigth Left Top Bottom 到目前为止 我尝试在签名的第 0 层上工作
  • Python 和 ctypes:如何正确地将“指针到指针”传递到 DLL 中?

    我有一个 DLL 它分配内存并返回它 DLL中的函数如下 void Foo unsigned char ppMem int pSize pSize 4 ppMem malloc pSize for int i 0 i lt pSize i