首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Python中的ctype访问DLL返回的对象的内容

使用Python中的ctype访问DLL返回的对象的内容
EN

Stack Overflow用户
提问于 2018-11-18 18:16:14
回答 2查看 1.3K关注 0票数 2

dll在使用python中的ctype调用函数时返回一个对象。

它返回以下内容--假设它被命名为ReturnO;print(ReturnO)给出了以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(63484, <DLLname.ClassName object at 0x09D35670>)

对象应该返回参数;它们的名称是: Paramater_1、Parameter_2等等。我的问题是,如何访问Parameter_1、Parameter_2等中的值。

如果我按以下方式打印

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(ClassName.Parameter_1)
print(ClassName.Parameter_2)

我得到以下信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Field type=c_float_Array_5, ofs=49483, size=20
 Field type=c_float_Array_5, ofs=49503, size=20

现在,我如何获得这个数组中的值。dotValue (.value)不工作。

感谢你的帮助。谢谢。

----------------ADDED/MODIFIED----------BELOW

下面是代码,感谢您的帮助:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num1=10.1234
int1=10
num11=1.1111
str1=”abcd”

ret=GetOutput_Main(int1,num1,num11,str1)

class ClassName(ctypes.Structure):
  _pack_ = 1
  _fields_ = [("parameter_1", ctypes.c_float * 5),
              ("parameter_2", ctypes.c_float * 5)]

def GetOutput_Main (int2,num2,num22,str2):
    lib = ctypes.WinDLL("mydllname.dll")
    prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_uint32, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ClassName))
    paramflags = (1, "int2",), (1, "num2",), (2, "num22",), (2, "str2",),
    Getoutput_Sub = prototype(("Getoutput", lib), paramflags))
    ret = Getoutput_Sub(int2,num2)
    print(ret) #gives the details of the object
    print(str2.parameter_1) #gives the details of array

指纹(Ret)给我:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(63484, <mydllname.ClassName object at 0x09D35670>)

如果我打印(Str2),我会得到以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<class 'mydllname.ClassName'>

打印(str2.parameter_1)给了我

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Field type=c_float_Array_5, ofs=49483, size=20

我正在寻找打开物品的方法,谢谢。

如果我这么做了,那么num22的大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UnpackedST = struct.unpack(str2,num22)

我得到以下错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Struct() argument 1 must be a str or bytes object, not _ctypes.PyCStructType
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-20 16:19:37

根据您的描述,您的C函数类似于以下内容:

test.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <inttypes.h>

#ifdef _WIN32
#   define API __declspec(dllexport)
#else
#   define API
#endif

struct ClassName {
    float parameter_1[5];
    float parameter_2[5];
};

API int __stdcall Getoutput(int a, uint32_t b, uint32_t* pc, struct ClassName* pd) {
    int i;
    *pc = a + b;
    for(i = 0; i < 5; ++i) {
        pd->parameter_1[i] = i * .5f;
        pd->parameter_2[i] = i * .25f;
    }
    return a * b;
}

paramflags参数指示两个输入(类型1)和两个返回值(类型2)。只需传递两个所需的输入值,并将结果存储在一个元组中。您可以在数组上调用list()或切片来访问它们的元素。我提供了一个__repr__函数,这样类在打印时就可以显示自己了。

test.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import ctypes as ct

class ClassName(ct.Structure):

    _fields_ = (('parameter_1', ct.c_float * 5),
                ('parameter_2', ct.c_float * 5))

    def __repr__(self):
        '''Return string describing how to print ClassName object.
        '''
        # Note that slicing an array produces a list of its elements.
        return f'ClassName({self.parameter_1[:]}, {self.parameter_2[:]})'

lib = ct.WinDLL('./test')
prototype = ct.WINFUNCTYPE(ct.c_int, ct.c_int, ct.c_uint32, ct.POINTER(ct.c_uint32), ct.POINTER(ClassName))
paramflags = (1, 'int2'), (1, 'num2'), (2, 'num22'), (2, 'str2')
Getoutput = prototype(('Getoutput', lib), paramflags)

pc, pd = Getoutput(10, 11)
print(f'{pc=} {pd=}')

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pc=21 pd=ClassName([0.0, 0.5, 1.0, 1.5, 2.0], [0.0, 0.25, 0.5, 0.75, 1.0])
票数 2
EN

Stack Overflow用户

发布于 2018-11-19 22:58:54

如果您有一个ctype浮点数数组,则有各种方法来获取每个浮点数。

示例:

我们从一个简单的python浮动列表开始,只是为了演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> python_float_list = [1.5, 2.5, 3.5, 4.5, 5.5]  

从列表中创建一个ctype浮点数数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> import ctypes
>>> c_float_array = (ctypes.c_float * 5)(*python_float_list)
>>> c_float_array
<__main__.c_float_Array_5 object at 0x000001D6D9A66A48>

ctypes数组是可订阅的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> c_float_array[0]
1.5
>>> c_float_array[1]
2.5

您也可以对它们使用for循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> for f in c_float_array:
    print(f)


1.5
2.5
3.5
4.5
5.5

由于ctype数组是可订阅的,您可以从它们获得一个python列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> list(c_float_array)
[1.5, 2.5, 3.5, 4.5, 5.5]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53367453

复制
相关文章
ASP.Net巧用窗体母版页
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/38865931
DannyHoo
2018/09/13
1.8K0
ASP.Net巧用窗体母版页
母版页
1. 在整个站点中应用母版页 <configuration> <system.web> <pages masterPageFile="~/Site.master" /> </system.web> </configuration> 2.动态应用母版页 void Page_PreInit (Object sender, EventArgs e) { Page.MasterPageFile = "~/Site.master"; } 3.操作模板页中的控件(两种方式:强类型与弱类型) 强
hbbliyong
2018/03/05
9870
一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)
前言 朋友们, 大家好,我还是Rector,写ASP.NET MVC 5系列文章 [一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar] 的那个家伙。 今天为大家带来本系列的第十篇文章。 本文知识要点 本文将要给大家分享的是页面统筹和规划方面的知识。 在上一篇文章发布后有朋友在评论中也反馈到了这个问题,即我们可以把每个页面中重复用到的布局代码放到统一的模板页面或者部分视图里面,以便代码的重用及维护。所以本文为大家分享的内容是: 母版页 部分
Rector
2018/03/29
1.9K0
一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)
母版页的使用(shtml)
使用母版页 1.网页很多地方长得一样,也有不一样的地方,Webform的母版页(MasterPage),使用母版页的窗体。 2.母版页太笨重。(加载母版页,然后进行多次填坑,麻烦!) 3.母版页使用ContentPlaceHolder挖坑,“使用母版页的窗体”用Content填坑 案例—1 新建一个母版页peo.Master <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="peo.master.cs" Inheri
静心物语313
2020/03/24
1.5K0
母版页的使用(shtml)
(转)母版页和相对路径
一个经常让开发人员疑惑的问题是母版页是如何处理相对路径的。如果你使用的是静态文字,这一问题不会困扰你。不过,如果你加入了<img>标签或者指向其他资源的HTML标签,问题就可能发生。
SAP梦心
2022/05/10
1.8K0
(转)母版页和相对路径
ASP.NET 2.0 中的异步页[来自MSDN]
ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员和角色管理服务等。但我认为最棒的功能是异步页,接下来让我告诉您其中的原因。 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程。一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求。如果一个同步请求成为 I/O 绑定(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求的线程在调用返回之前处于挂起状态。这影响了可伸缩性,原因是线程池
菩提树下的杨过
2018/01/23
1.9K0
ASP.NET 2.0 中的异步页[来自MSDN]
VS2008(C#)子页嵌套母版页的控件访问方法(一)
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage_MasterPage" %>
阳光岛主
2019/02/19
1.3K0
VS2008(C#)子页嵌套母版页的控件访问方法(三)
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage_MasterPage" %>
阳光岛主
2019/02/19
1.1K0
Thymeleaf使用技巧:使用片段(fragment)实现母版页(Layout)功能
网站中往往有通用的布局,比如导航、底部等等,这些页面中共用的部分,就需要放在母版页(Layout)里面。 这样每个页面只用关注本页面要完成的功能/内容即可。提高了开发效率,也降低了公共部分的维护成本。
KenTalk
2018/09/11
10.4K1
VS2008(C#)子页嵌套母版页的控件访问方法(二)
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage_MasterPage" %>
阳光岛主
2019/02/19
1.3K0
ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
本篇代码以下代码进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
KenTalk
2018/11/12
2.9K0
ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
关于ContentPlaceHolder与Content控件
ContentPlaceHolder 控件:在 ASP.NET 母版页中定义内容区域。
全栈程序员站长
2022/09/14
7080
ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传
1.母版页是与Controller无关的,母版页只是一个View文件,而没有任何Controller与之相对应。
重典
2022/04/11
1.2K0
ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传
ASP.NET MVC 5 - 视图
在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML。 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所引入的Razor视图引擎(Razor view engine)。Razor视图模板文件使用.cshtml文件扩展名,并提供了一个优雅的方式来使用C#语言创建所要输出的HTML。用Razor编写一个视图模板文件时,将所需的字符和键盘敲击数量降到了最低,并实现了快速,流畅的编码工作流程。 当前在控制器类中的Inde
葡萄城控件
2018/01/10
3.2K0
ASP.NET MVC 5 - 视图
ASP.NET控件的CSS定位
        ASP.NET标准控件功能强大,虽然在编程方面方便点,后台代码可以任意访问到并操作,但CSS对母版内容页里的标准控件则很难。原因是经过编译之后的页面标准控件的ID都会变为母版页占位符和原ID的合成字符串,已经不是原来的ID值了,此时如果你的CSS是用ID来定位则失效(在没有母版页的普通aspx页面里标准空间的id值经过编译之后不会变化)。这就是为什么VS中查看到的代码和浏览器中看到的不一样的原因了。因此用CSS来定位最好是使用Class或者CssClass来做。
SAP梦心
2022/05/10
2K0
dropdownlist的AutoPostBack属性「建议收藏」
我最近在做一个教学楼管理系统,老师说最好做成动态网页的形式,反正我也希望自己学习一下有关.net的东西,于是就选择了asp.net,在这之前我学习过mfc,asp 所以入门不算太难,甚至在刚刚接触C#的时候还很兴奋,觉得用vc++要写大段代码解决的问题,而用C#几乎一段代码都不用写。所以学习了一周时间我就开始准备动手做教学楼管理系统,在做的过程中遇到了很多的问题,今天上午我准备用母版页的技术来实现各个页面的统一布局,在模板页上放置各种控件,单击查询按钮在内容页显示查询的结果,当时我为了尽量减少因为用户使用时输入不正确的字符造成的操作性错误,我就选用大量的dropdownlist 控件代替textbox控件,准备随着dropdownlist控件选项的改变动态生成其他不同的控件,但是当我准备编写代码实现该功能的时候发现dropdownlist 控件的触发响应事件方法中的代码根本就没有响应,按照VC++的经验我觉得是是因为这个控件是放在母版上的原因,所以就一头钻进了书海查找关于母版方面的知识一直到中午这个问题都没有解决,到了晚上我尝试性的将dropdownlist换成了button控件,结果button的按钮点击事件能够响应,所以断定不是因为我先前认为的母版的原因,肯定是dropdownlist控件哪里没有用对,所以就在百度里面搜素了一下关于的dropdownlist事件响应方面的问题,呵呵原来我没有把dropdownlist的AutoPostBack属性设置为ture,就这样一个常识性的问题,花了我我一天的时间,但是还是挺值得的在我解决问题的过程了看了一些关于母版、皮肤、主题方面的资料加深了自己对他们的认识,在以后的使用到这些技术的时候,一点会少花一点时间。总之生活很简单,遇到困难的时候拒绝堕落,拒绝灰心丧气就行。
全栈程序员站长
2022/11/03
7750
django html母版
08.12自我总结 django母版 一.母版写的格式 在需要导入的地方写 {% block 名字定义 %} {% endblock %} 二.导入模板 {% extends 'FUCK.html' %} #模板的文件名称 {% block 名字定义 %} 模板内添加的内容 {% endblock %}
小小咸鱼YwY
2019/09/11
5720
关于Firefox中链接点击弹出空白标签页的问题分析
昨天突然有好心人提醒我说我的网站某些链接在firefox中打开时会弹出 about:blank 的空白页面。本来自己在测试的时候没怎么考虑浏览器的兼容问题,毕竟自己总共也没写几个标签。不过研究了一下发现前端这一行做起来还真挺麻烦的。
mythsman
2022/11/14
1.6K0
ASP.NET中cs代码页找不到aspx页面中的控件ID
最近在写一个BBS,依照书的葫芦画我的瓢,但是就算这样其中仍然出了不少问题。刚解决如上所述问题。
望天
2018/08/02
4.3K0
lxparse:解析列表页链接和详情页内容
Github地址:https://github.com/lixi5338619/lxparse
李玺
2022/09/23
1.2K0
lxparse:解析列表页链接和详情页内容

相似问题

安装停靠卷销毁文件?

10

用regex提取停靠文件卷

11

在文件中删除卷参后,停止停靠在容器中组装卷

11

安装ElasticSearch停靠-组合时未能装入本地卷错误

114

允许停靠的闪亮应用程序访问本地卷

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文