今天客户在用Python调用我们的动态库的时候,遇到一个问题,调用动态库中的函数,函数返回的是BSTR字符串,但是客户接收到的是一个8位长度的数字。
动态库函数原型:EXTERN_C BSTR ELOAMAPI EloamGlobal_GetIdCardData(LONG flag)
解决这个问题可以从两个方面思考:
方法一:了解本质,百度百科BSTR:https://baike.baidu.com/item/BSTR/9858730?fr=aladdin
方法二:推理
这里记录下方法二:
1. 接收到的是个8位长度的数字。数字,还是8位长度,这玩意应该是一个地址。
2. 既然是一个地址,那只要我们去这个地址,然后就知道正确的字符串了。
3. 我们是使用的 ctypes 来调用动态库的,所以我们使用 ctypes 这个交通工具去这个地址就可以了
4. 查看 ctypes 库文档,我们可以发现有两种方法可以去这个地址【c_char_p, c_wchar_p】
5. 看函数原型,返回的是BSTR,这里可以看出我们应该使用  c_wchar_p
6. 通过调试,我们就可以看见有个value属性,对应的就是我们需要的字符串了
完整代码:
from ctypes import windll
import ctypes # EXTERN_C BSTR ELOAMAPI EloamGlobal_GetIdCardData(LONG flag)
res_p = dll.EloamGlobal_GetIdCardData(1)
res_str = ctypes.c_wchar_p(res_p).value
print(res_str)

Python调用动态库,获取BSTR字符串的更多相关文章

  1. 使用Python调用动态库

    我个人在日常使用电脑时,经常需要使用Google,于是就要切换代理,基本上是一会儿切换为代理,一会儿切换成直连,老是打开internet 选项去设置,很不方便,于是我萌生了一个想法: 做一个开关,我想 ...

  2. [转]linux 调用动态库so文件

    记录一个面试被问到的问题. extern 有什么用途? 除了多文件共享全局变量外还有呢? extern "C" 的功能? 我想看完这篇文章就可以知道第三个问题了. 关于动态调用动态 ...

  3. LoadLibraryA 和 GetProcAddress 调用动态库

    通过LoadLibraryA 和 GetProcAddress,动态调用无需配置链接库lib和相关的头文件配置.下面介绍一个例子的实现 1.动态库 A.加法类 头文件:#pragma once cla ...

  4. 一个简单的C共享库的创建及Python调用此库的方法

    /********************************************************************* * Author  : Samson * Date    ...

  5. Python调用C库

    Python调用C库 Python可以利用ctypes库很方便地调用C的库函数. C库例程: # file: a.c int sum(int a, int b){   int t = 0;   int ...

  6. # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库

    使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...

  7. windows 创建和调用 动态库,静态库

    windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...

  8. c++调用动态库失败解决办法

    c++调用动态库失败解决办法 之前写好的程序今天早上过来发现在服务器上出错了,于是就各种查问题,整整一个早上外加下午两个小时都在查这个问题,最终被我找到了问题: 在程序中我发现LoadLibrary( ...

  9. C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)

    C++---初识<通过g++ / makefile  编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...

  10. Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

    系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...

随机推荐

  1. 【API Management】使用 APIM Inbound Policy 来修改Content‐Type Header的值

    问题描述 在使用APIM提供API服务管理的场景中,遇见了客户端请求时候发送的请求Header中的Content-Type不满足后台服务器的要求,但是在客户端要求客户修改代码难度较高. 所以面对这样的 ...

  2. 【Azure 存储服务】Storage Account Blob 使用REST API如何获取磁盘大小(Content-Length), IOPS信息

    问题描述 1)关于使用Rest API获取非托管磁盘信息比如获取磁盘大小 2)关于使用Rest API获取非托管磁盘信息比如iops 问题答案 #1:关于使用Rest API获取非托管磁盘信息比如获取 ...

  3. Lua学习笔记3

    Lua学习笔记3 IO读写 Lua中读写使用自带的I/O库处理文件. 分为简单模式和完全模式. 简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操 ...

  4. Windows配置R语言、RStudio开发环境

      本文介绍R语言及其集成开发环境RStudio的下载.安装方法.   R语言是一个属于GNU操作系统的开源软件,在数据统计与分析.可视化等方面具有优秀的表现:而RStudio则是R语言的集成开发环境 ...

  5. 基于DSP的光纤麦克风声音采集系统硬件设计方案总结

    前记  光纤声传感器是一种利用光纤作为传光介质或探测单元的一类声传感器,相比传统电声传感器其具有灵敏度高.频带响应宽.抗电磁干扰等优越特性,可广泛应用于国防安全.工业无损检测.医疗诊断及消费电子等领域 ...

  6. 微型MPU6050模块及串口/BLE透传的实物展示

    前言   随着时间的积累,项目的沉淀.把很多做过的产品标准化掉,形成可以立即拿出来使用的产品.是非常重要的一个环节.最近,把基于MPU6050的模块微型化并使用串口透传这个产品梳理了一下.形成了标准化 ...

  7. Kettle实战视频教程

    kettle实战视频教程 欢迎关注笔者的公众号: java大师, 每日推送java.kettle运维等领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!!个人网站: http://w ...

  8. 吐槽 Android的WebView的pauseTimers方法神坑 webview加载卡住

    原文: 吐槽 Android的WebView的pauseTimers方法神坑 webview加载卡住 | Stars-One的杂货小窝 说明 之前公司的项目和别的公司一起合作,忽然出现情况,进入到他们 ...

  9. day05-Lombok、SpringInitializer

    Lombok.Spring-Initializer 1.Lombok 1.1Lombok介绍 Lombok的作用是: 简化Javabean的开发,可以使用Lombok的注解让代码更加简洁 Java项目 ...

  10. spring boot2集成api文档工具swagger-ui(上)

    说明 第一步:创建项目 浏览器打开:https://start.spring.io/,生成一个spring boot项目 点击Generate这个按钮,下载项目包文件 第二步:导入开发工具 打开下载目 ...