你能把LPTSTR投射到BSTR吗?
将LPTSTR直接转换为BSTR是合法的吗?
根据我对BSTR的理解,直接将一个LPTSTR转换为BSTR会给你留下一个损坏的长度前缀。示例代码明确指出字符串文字不能存储到BSTR。任何人都可以向我确认LPTSTR / LPCTSTR不能在不破坏长度前缀的情况下直接转换为BSTR吗?
编辑:
我的困惑是看到在调用COM对象时使用它。事实证明,在编译COM dll时,会生成一个.tli文件,用于创建中间方法。此方法采用类型
_bstr_t
。 _bstr_t
可以在其构造函数中使用LPTSTR
,因此一切运行顺利。
没有找到相关结果
已邀请:
8 个回复
锯康
是
,你可以使用SysAllocString将指针转换为宽字符串到
。 直接强制转换是不可能的,因为两者具有不同的内存表示。 如果使用C ++,则可以使用_bstr_t类来简化
字符串的使用。
漂截嘘
s作为
s传递,你会发现你会随机炸掉你附近的任何互操作编组码。编组将拉出4字节前缀(这是随机数据)为
并尝试和Marshall字符串。 您会发现4字节前缀原来是缓冲区之前的堆栈内容,甚至是前面字符串中更好的字符数据。然后你会尝试编组兆字节的数据... :-) 如果需要保留
指针,请使用
包装并使用
。 如果编译器在这个问题上发出警告,那就太好了。
肺鬼耙扮群
禽兢玫坞劲
之前的内存中的四个字节将被视为结果的长度
。这可能会导致现场出现内存保护错误(不太可能),但肯定会导致
的长度可能大于原始长度
。因此,当有人试图从中读取或写入时,他们可能会访问无效的内存。
肉簧咸缮
抹持奠糙驰
(来自
)来帮助您轻松完成此操作。样品:
才脊烽馈低
烫珊
(因此
在字符串中可以包含
,因为它最终是一个计数的字符串类型。 使用C ++时最好的选择是使用ATL类
代替
。在任何一种情况下,您都可以使用ATL / MFC转换宏
和朋友。 另请注意,文档(MSDN)说: 推荐的转换方式 从
字符串是使用
上课。要转换成
, 将现有字符串传递给
的构造函数。转换 来自BSTR,使用
[
] DestinationType [
],例如
。 ...适用于您的用例。 请参阅John Dibling的答案(
)。