问题标签 [bstr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mfc - 从函数返回的损坏的 LPCTSTR 字符串
我有两个项目,A 和 B
项目 A 编译时使用:
1. 标准 Windows 库
2. 多字节字符集
3. 不支持通用语言
项目 B 编译时使用:
1. MFC 作为动态 dll
2. 多字节字符集
3. WITH 使用公共语言支持
在项目 A 中定义了以下函数:
}
并使用以下命令从项目 B 中调用:
但是当调用驱动程序名称时,“名称”的内容是垃圾
c++ - 用于检测将 wchar_t* 传递给 BSTR 的静态代码分析
由于 aBSTR
只是 atypedef
对于wchar_t*
我们的代码库有几个(很多?)地方,其中字符串文字被传递给期望 a 的方法,BSTR
这可能会混淆编组器或任何试图使用任何BSTR
特定方法的人(例如SysStringLen
)。
有没有办法静态检测这种类型的滥用?
我尝试使用 VC10/Wall
和静态代码分析Microsoft All Rules进行编译,但以下有问题的代码没有被它们中的任何一个标记。
更新:在试图破坏wtypes.h
以检测这些类型的违规行为后,我已经放弃了。
我尝试了两条路径,这两条路径都可以使用上面的示例程序,但是一旦我尝试了一个真正的项目,它们就失败了。
- 创建一个名为的类
BSTR
,但由于 aVARIANT
有 aBSTR
作为联合成员,因此新类不能有任何构造函数或赋值运算符,这破坏了每个地方都NULL
被视为 aBSTR
。我尝试用NULL
具有转换运算符的类型替换,但在添加了数十个新运算符(比较、转换等)后,我开始遇到模棱两可的调用并放弃了。 - 然后我尝试了@CashCow 和@Hans 建议的方式(制作
BSTR
另typedef
一种类型的指针)。这也不起作用,在添加toBSTR
和fromBSTR
方法并乱扔comutil.h (_bstr_t
) 和其他带有转换的地方之后,我终于到了编译器在 IDL 生成的头文件中窒息的地步(默认值被转换为文字宽字符串)。
简而言之,我已经放弃尝试自己实现这一目标,如果有人知道可以帮助我的代码分析工具,我会很高兴听到它。
visual-c++ - 使用 ::SysFreeString() 释放 BSTR。更依赖于平台?
我正在编写一个具有大量接口和方法的 COM 服务器。并且大多数方法都将 BSTR 作为参数并作为用于返回的本地参数。一个片段看起来像
更新 5:
真正的代码。这会根据数据库的特定条件从一堆数据中获取,以填充对象数组。
问题在于内存释放部分。该代码在任何 Win XP 机器上都可以正常工作,但是当涉及到 WIN2K8 R2 和 WIN7 时,代码会崩溃并指向 ::SysFreeString() 作为罪魁祸首。MSDN 不足以解决此问题。
任何人都可以帮助找到正确的解决方案吗?
提前非常感谢:)
更新1:
我已经尝试按照建议使用 CComBSTR 代替原始 BSTR,使用直接 CString 初始化并排除 SysFreeString()。但是对于我的麻烦,在超出范围时,系统正在调用 SysFreeString() 再次导致崩溃:(
更新 2: 使用相同的 CComBSTR 我尝试使用 SysAllocString() 进行分配,问题仍然相同:(
更新 3: 我厌倦了所有的选择,我心里只想着一个问题
是否有必要通过使用 SysAllocString()/string.AllocSysString() 分配的 SysFreeString() 来释放 BSTR?
更新 4: 我错过了提供有关崩溃的信息。当我尝试调试 COM 服务器时出现错误提示
“可能的堆损坏”
. 请帮我离开这里.. :(
c++ - ::SysFreeString() 仅在 WINDOWS2008 中崩溃
我有一个使用 BSTR 的 COM 代码。
在使用 ::SysFreeString() 时应用程序崩溃
但是在 WINDOWS2003、WIN7、WINXP 等中同样有效。
关于导致问题的原因或可能出错的任何想法。示例代码如下
c++ - 如何在 C++ 中使用嵌入的 NULL 字符构造 BSTR?
如何使用嵌入的 NULL 字符构造 BSTR?
c - 在 C 中处理 MacOSX 上的 BSTR
当从 MacOSX dylib 从 VBA 调用 C 代码时,我用 C 编写了一些代码来转换从 VBA 传递的字符串。我在这里得到了一些很好的提示,因为我只关心 ASCII 字符串,所以我编写了以下函数来将其转换BSTR
为简单的char*
:
myheader.h 看起来像这样:
. 我使用uint16_t
MacOSX C 编译器中的 4 字节(不是 2 字节)wchar_t。我在调用后添加了一个断点vbstochar
来查看 的内容convarg
,从 Excel 调用它似乎可以工作。
所以这行得通,但我不明白的一件事是为什么我必须将函数len
中的我乘以vbstrlen
2。我是 C 的新手,所以我不得不稍微阅读一下指针 - 我想自从我的 BSTR包含 2 个字节的字符,我应该得到正确的字符串长度而不必乘以 2?如果有人可以向我解释这一点,或者发布指向教程的链接,那就太好了?
此外,我的带有字符串参数的函数在 VBA 中调用时有效,但仅在第一次调用之后。因此,当我BSTR*
第一次使用来自 dylib 的参数调用函数时(在我启动应用程序后,在本例中为 Excel),BSTR*
指针只指向某个(随机?)地址,而不是字符串。当我第二次从 VBA 调用该函数时,一切正常 - 任何想法为什么会这样?!
c++ - 阿拉伯语文本的 BSTR 到 CString 转换
我的 VC++ (VS2008) 项目使用多字节字符集。
我有以下代码将日期字符串转换为 COleDateTime
此代码适用于所有区域设置,但在阿拉伯语区域设置中失败,输入日期为以下格式:21/05/2012 11:50:31م
转换后,CString 包含垃圾字符,解析失败:01/05/2012 11:50:28ã
是否有适用于阿拉伯语设置的 BSTR 到 CString 的转换?
c - C: int 到 _bstr_t
我正在尝试使用 c 在 excel 中绘制一系列图。问题是当我尝试在循环中制作绘图时,我必须在 excel 中更改工作表的名称。但这些名称采用 _bstr_t 格式:
我想让 name 看起来像 ("Sheet number %d",i),其中 i 是计数器。我尝试使用 sprintf 和其他方法,但没有运气。
任何帮助,将不胜感激!
c++ - 将 BSTR 存储在 std::vector 中?
我有一个 ATL COM 组件方法,它将 BSTR 作为 in 参数。我需要在一个数组中添加对该方法的每个调用。我不能使用 SAFEARRAY,因为它是固定大小的,所以我认为 std::vector 将是最简单的选择。当然,我需要为向量的每个添加调用 SysAllocString。这意味着在销毁向量之前,需要为每个条目调用 SysFreeString。
我正在寻找一个更简单/更清洁的解决方案,并考虑将向量声明为 vector<_bstr_t> ,其中包括自动清理。然而,在我的脑海里,有一些事情正在引发警报,因为它实际上是一个标准容器中的智能指针。我的担心是合理的还是我可以安全地做到这一点?如果没有,还有其他更好的解决方案吗?