Python调用动态库,获取BSTR字符串
今天客户在用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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具