BSTR内存结构

CorelDraw插件开发-_bstr_t-字符串对象-内存结构分析-CDR插件开发 通过范例的形式,分析_bstr_t对象的内存模型,方便在逆向分析时遇到此对象时,更好的理解,同时熟练使用X64dbg查看内存数据。 阅读详情

COM 中除了使用一些简单标准的数据类型外,字符串类型需要特别重点地说明一下。还记得原则吗?COM组件是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。你想想,系统需要把这块内存的内容传递到“地球另一边”的计算机上,因此,我至少需要知道你这块内存的尺寸吧?不然让我如何传递呀?传递多少字节呀?!而字符串又是非常常用的一种类型,因此 COM设计者引入了BASIC中字符串类型的表示方式—BSTR,BSTR 其实是一个指针类型,它的内存结构是:(输入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");断点执行,然后观察p的内存)


BSTR
是一个指向UNICODE 字符串的指针,BSTR前的4个字节中,使用DWORD保存着这个字符串的字节长度(没有含字符串的结束符)。因此系统就能够正确处理并传送这个字符串到“地球另一边”了。特别需要注意的是,由于BSTR的指针就是指向UNICODE 串,因此BSTR和LPOLESTR可以在一定程度上混用,但一定要注意:
有函数 fun(LPCOLESTR lp),则你调用BSTR p=fun(p); 正确
有函数 fun(const BSTR bstr),则你调用 LPCOLESTR p=fun(p);错误!!!
有关BSTR的处理函数:
 

API 函数

说明

SysAllocString()

申请一个BSTR指针,并初始化为一个字符串

SysFreeString()

释放BSTR内存

SysAllocStringLen()

申请一个指定字符长度的BSTR指针,并初始化为一个字符串

SysAllocStringByteLen()

申请一个指定字节长度的BSTR指针,并初始化为一个字符串

SysReAllocStringLen()

重新申请BSTR指针

CString 函数

说明

AllocSysString()

从 CString 得到BSTR

SetSysString()

重新申请BSTR指针,并复制到 CString 中

CComBSTR 函数

ATL 的BSTR包装类。在 atlbase.h 中定义

Append ()、AppendBSTR()、AppendBytes()、ArrayToBSTR()、BSTRToArray()、AssignBSTR()、 Attach()、Detach()、Copy()、CopyTo()、Empty()、Length()、ByteLength()、 ReadFromStream()、WriteToStream()、LoadString()、ToLower()、ToUpper()
运算符重载:!,!=,==,<,>,&,+=,+,=

太多了,但从函数名称不能看出其基本功能。详细资料,查看MSDN 吧。另外,左侧函数,有很多是 ATL 7.0 提供的,VC6.0 下所带的 ATL 3.0 不支持。
由于我们将来主要用ATL开发组件程序,因此使用ATL的 CComBSTR 为主。VC也提供了其它的包装类_bstr_t。

BSTR、LPSTR和LPWSTR BSTR,LPSTR,LPWSTR,char*和CString相互转换。 立即下载

相关推荐

BSTR详解一,二

COM是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。 • C++ 字符串是以0结束的ASCII或Unicode字符数组 • Visual Basic字符串是一个ASCII字符数组加上表示长度的前缀。 • Java字符串是以0结束的Unicode字符数组。 需要定义一种通用的字符串类型,可以很容易的匹配到不同编程语言。在C++中,就是BSTR。

BSTR基本用法与类型转换

用到BSTR的时候不太熟悉,经常需要查询,整理了一下以免忘记。 BSTR 是一个指向 UNICODE 字符串的指针,且 BSTR 向前的4个字节中,使用DWORD保存着这个字符串的字节长度( 没有含字符串的结束符)。 头文件:BSTR在atlconv.h中定义,但在使用时包含windows.h或者atlbase.h文件也不会报错。 BSTR的存储结构为: 1. 字符串头 ---4字节 存储了包好字节(Byte)的个数,长度不包括结束符,使用下面语句可以查询出字符串头,从而获取BSTR存储内容的字

gdizcm的专栏 5557

BSTR详细解释用法

是一个关于BSTR的全面介绍,包括方方面面。比较详细,

BSTR详解

 BSTR详解一 - BSTR简介和内部结构 1         Why need BSTRCOM是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。·                     C++ 字符串是以0结束的ASCII或Unicode字符数组 ·                     Visual Basic字符串是一个ASCII字符数

FUJIANJUN的专栏 5021

BSTR导致内存泄露问题

在开发中对经常会由于粗心或遗漏而导致的BSTR内存泄露问题,特意研究并进行了整理,内部有教详细的说明,希望对大家能有所帮助。(注:涉及公司版权问题,仅供参考、谢谢)

开关电源EMI优化秘籍:三明治绕法如何让你的产品通过认证测试

本文深入解析了开关电源EMI优化中的三明治绕法,详细阐述了其通过改变绕组排布来减小初次级寄生电容、降低共模噪声的核心机理。文章提供了从绕制结构选择、绝缘安规处理到实测验证的全流程实战指南,帮助工程师有效利用这一工艺,提升产品通过CCC、CE等EMI认证测试的成功率。

tcp8optimizer的博客 706

BSTR,_bstr_t ,CComBSTR

BSTR BSTR(Basic string or binary string)是COM 、Automatic、Interop使用的string数据类型。在从脚本访问的所有接口中使用BSTR。 BSTR被定义为OLECHAR*类型,查看OLECHAR类型的声明,可以发现它其实是一个wchar_t类型,也就是说一个BSTR字符串其实是一个UNICODE字符串。 COM 是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。 · ...

qq_37240392的博客 1861

NTFS分区变成RAW别乱修!正确数据恢复与修复方法详解

文件系统是操作系统管理存储数据的核心机制,NTFS作为Windows主流文件系统,一旦分区识别异常,常会显示为RAW格式。分区变RAW通常意味着文件系统入口信息损坏,而非数据物理消失,但若采用错误的修复方式,如直接对RAW分区执行chkdsk /f,可能因系统无法正确识别文件系统结构,导致写入操作落在错误偏移位置,二次破坏本可恢复的数据。正确的处理思路是:先停止一切写入操作,通过扇区级镜像备份保留原始现场,再分析DBR、分区表及$MFT状态,依据诊断结果选择修复或深度扫描恢复。实际排查中,常见问题如DBR记

weixin_31155097的博客 134

BSTR用法详解

BSTR详解  BSTR 详解一 - BSTR 简介和内部结构 1          Why need BSTR COM 是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。 ·                     C++ 字符串是以 0 结束的 ASCII 或 Unicode 字符数组 ·                     Vi

如果爱下去的专栏 8633

Js逆向抖音a_bogus --/* V 1.0.1.19-fix.01 */补环境

需要在addEventListener中补一个鼠标移动事件,不补这个环境,生成的值是假值,你拿去请求,响应200,但是没有数据,这个算是dy的最难发现的一个难点。dy这个,没有原形链检测,我只是习惯了这样补,对XMLHttpRequest进行重写,导出a_bogus.发现可以响应状态码200,而且可以获取数据,接着注释params中的a_bogus。在n.apply的下面插入上述代码,对a_bogus进行全局导出。如果没有,就多放几次断点,因为每个人的游览器不一样。必须触发至少一次鼠标事件,不触发不给过。

2302_76420666的博客 4202

深入理解「二进制掩码」:从原理到实践

二进制掩码本质上是一个二进制数,用于通过位操作(如与、或、非、异或等)选择性地操作目标数据的某些位。掩码的每一位(bit)可以看作一个“开关”,决定是否对目标数据的对应位进行操作。二进制掩码是位操作的灵魂,掌握它不仅能提升代码效率,还能解锁许多高级编程技巧。从基础的位提取到复杂的子集枚举,掩码的应用无处不在。希望本文的讲解和代码示例能帮助你快速上手,并在实际项目中灵活运用。如果你有更多关于掩码的疑问或应用场景,欢迎在评论区留言交流!

m0_73494933的博客 2432

BSTR详解一 - BSTR简介和内部结构

1         Why need BSTRCOM是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。 C++ 字符串是以0结束的ASCII或Unicode字符数组 Visual Basic字符串是一个ASCII字符数组加上表示长度的前缀。 Java字符串是以0结束的Unicode字符数组。需要定义一种通用的字符串类型

技术随笔 1万+

PCIe设备内存访问实战:从ioremap到DMA映射的完整流程解析

本文深入解析了PCIe设备内存访问的完整流程,涵盖从CPU通过ioremap访问设备寄存器,到设备通过DMA映射高效读写主机内存的核心机制。详细探讨了虚拟地址、物理地址与总线地址的转换关系,对比了一致性与流式DMA映射的适用场景及同步要点,并阐述了IOMMU在安全与效率中的作用,为驱动开发者提供了实战代码与关键陷阱分析。

weixin_29201933的博客 505

BSTR解析

COM 中除了使用一些简单标准的数据类型外(注2),字符串类型需要特别重点地说明一下。还记得原则吗?COM 组件是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。你想想,系统需要把这块内存的内容传递到“地球另一 边”的计算机上,因此,我至少需要知道你这块内存的尺寸吧?不然让我如何传递呀?传递多少字节呀?!而字符串又是...

weixin_33705053的博客 265

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8400

【大模型工程局】告别单打独斗:手把手带你构建多智能体系统(MetaGPT 启示录)

想象一下,不再是只有一个全知全能的 AI,而是有一群各有所长、能够独立思考和行动的“智能体”(Agent)。它们生活在一个共同的环境中,可以相互交流、协作完成共同目标,也可能为了有限资源而相互竞争。这就是多智能体系统(MAS)的核心图景。MAS 的关键特征:自治性 (Autonomy):每个智能体都能独立感知环境、做出决策并执行动作,无需外部直接控制。交互性 (Interaction):智能体之间可以通过某种通信机制(显式或隐式)交换信息、协调行为。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1184

BSTR 的格式

//BSTR 的格式//union XBSTR{  int len; //字节数  wchar_t n_ch; //字符  short tail;//结束符};  //BSTR 的验证//void test_bstr_fmt(){  char *p = new char[10];  //4个字节  //  p [0] = 4; //int型 保存的是字节数  p[1] = 0; 

i_air的专栏 730

【数字IC/FPGA】低功耗设计

低功耗设计方法功耗的类型低功耗设计方法静态低功耗技术多阈值工艺方法电源门控方法体偏置动态低功耗技术多电压域(Multi-Voltage Domain)预计算门控时钟门级优化技术毛刺的消除逻辑级优化物理级优化控制输入向量低功耗Soc系统的动态管理动态电压及频率调节技术低功耗操作系统存储器功耗控制总结 功耗的类型 CMOS电路中的功耗由两部分构成,第一部分为负载电容充放电时引起的功耗,称为动态功耗,另一部分为漏电流引起的功耗,称为静态功耗。其中动态功耗包括翻转功耗和短路功耗。翻转功耗是数字电路中信号翻转时电容充

qq_40268672的博客 3072

打包传输结构体或大内存块

作者 郑昀 内容  

freerock 2085

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

问津BSTR

    COM 中除了使用一些简单标准的数据类型外(注2),字符串类型需要特别重点地说明一下。还记得原则吗?COM 组件是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。你想想,系统需要把这块内存的内容传递到“地球另一 边”的计算机上,因此,我至少需要知道你这块内存的尺寸吧?不然让我如何传递呀?传递多少字节呀?!而字符串又是非常常用的一种类型,因此 COM 设

Tech is Online(物联网技术传播) 1040

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[C++]打包传输结构体或大内存块的四种办法(完全版)

打包传输结构体或大内存块作者 郑昀内容 BSTR的解法SAFEARRAY的解法boost::serialization的解法IStream流的解法本文假定您熟悉 SAFEARRAY、C++、BOOST 和 MSMQ。 摘要:本文阐述了结构体/大内存块分布式传输时常用的四种打包方法,并演示了您如何利用这四种方法通过MSMQ发送/读取数据。 有时候我们需要远程传输各种结构体或者数据块,比如您通过M

软件开发资料汇总 557

BSTR

四、BSTR   COM 中除了使用一些简单标准的数据类型外(注2),字符串类型需要特别重点地说明一下。还记得原则吗?COM 组件是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。你想想,系统需要把这块内存的内容传递到“地球另一 边”的计算机上,因此,我至少需要知道你这块内存的尺寸吧?不然让我如何传递呀?传递多少字节呀?!而字符串又是非常常用的一种类型,

autumn20080101的专栏 504

BSTR 数据类型

COM 中除了使用一些简单标准的数据类型外,字符串类型需要特别重点地说明一下。因此 COM 设计者引入了 BASIC 中字符串类型的表示方式---BSTR。BSTR 其实是一个指针类型,它的内存结构是:(输入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");断点执行,然后观察p的内存)        BSTR 内存结构   BSTR 是一个指向

志汉天涯~!~Day Day Up~ 1059
上一篇: 很幽默的讲解六种Socket I/O模型
下一篇: 基于C语言的内存池的设计与实现
逸学堂
博客等级 码龄23年 1104粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值