问题标签 [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.

0 投票
1 回答
475 浏览

mfc - 从函数返回的损坏的 LPCTSTR 字符串

我有两个项目,A 和 B

项目 A 编译时使用:
1. 标准 Windows 库
2. 多字节字符集
3. 不支持通用语言

项目 B 编译时使用:
1. MFC 作为动态 dll
2. 多字节字符集
3. WITH 使用公共语言支持

在项目 A 中定义了以下函数:

}

并使用以下命令从项目 B 中调用:

但是当调用驱动程序名称时,“名称”的内容是垃圾

0 投票
4 回答
1425 浏览

c++ - 用于检测将 wchar_t* 传递给 BSTR 的静态代码分析

由于 aBSTR只是 atypedef对于wchar_t*我们的代码库有几个(很多?)地方,其中字符串文字被传递给期望 a 的方法,BSTR这可能会混淆编组器或任何试图使用任何BSTR特定方法的人(例如SysStringLen)。

有没有办法静态检测这种类型的滥用?

我尝试使用 VC10/Wall和静态代码分析Microsoft All Rules进行编译,但以下有问题的代码没有被它们中的任何一个标记。


更新:在试图破坏wtypes.h以检测这些类型的违规行为后,我已经放弃了。

我尝试了两条路径,这两条路径都可以使用上面的示例程序,但是一旦我尝试了一个真正的项目,它们就失败了。

  1. 创建一个名为的类BSTR,但由于 aVARIANT有 aBSTR作为联合成员,因此新类不能有任何构造函数或赋值运算符,这破坏了每个地方都NULL被视为 a BSTR。我尝试用NULL具有转换运算符的类型替换,但在添加了数十个新运算符(比较、转换等)后,我开始遇到模棱两可的调用并放弃了。
  2. 然后我尝试了@CashCow 和@Hans 建议的方式(制作BSTRtypedef一种类型的指针)。这也不起作用,在添加toBSTRfromBSTR方法并乱扔comutil.h ( _bstr_t) 和其他带有转换的地方之后,我终于到了编译器在 IDL 生成的头文件中窒息的地步(默认值被转换为文字宽字符串)。

简而言之,我已经放弃尝试自己实现这一目标,如果有人知道可以帮助我的代码分析工具,我会很高兴听到它。

0 投票
2 回答
6894 浏览

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 服务器时出现错误提示

“可能的堆损坏”

. 请帮我离开这里.. :(

0 投票
1 回答
1191 浏览

c++ - ::SysFreeString() 仅在 WINDOWS2008 中崩溃

我有一个使用 BSTR 的 COM 代码。

在使用 ::SysFreeString() 时应用程序崩溃

但是在 WINDOWS2003、WIN7、WINXP 等中同样有效。

关于导致问题的原因或可能出错的任何想法。示例代码如下

0 投票
2 回答
496 浏览

c++ - 如何在 C++ 中使用嵌入的 NULL 字符构造 BSTR?

如何使用嵌入的 NULL 字符构造 BSTR?

0 投票
2 回答
392 浏览

c - 在 C 中处理 MacOSX 上的 BSTR

当从 MacOSX dylib 从 VBA 调用 C 代码时,我用 C 编写了一些代码来转换从 VBA 传递的字符串。我在这里得到了一些很好的提示,因为我只关心 ASCII 字符串,所以我编写了以下函数来将其转换BSTR为简单的char*

myheader.h 看起来像这样:

. 我使用uint16_tMacOSX C 编译器中的 4 字节(不是 2 字节)wchar_t。我在调用后添加了一个断点vbstochar来查看 的内容convarg,从 Excel 调用它似乎可以工作。

所以这行得通,但我不明白的一件事是为什么我必须将函数len中的我乘以vbstrlen2。我是 C 的新手,所以我不得不稍微阅读一下指针 - 我想自从我的 BSTR包含 2 个字节的字符,我应该得到正确的字符串长度而不必乘以 2?如果有人可以向我解释这一点,或者发布指向教程的链接,那就太好了?

此外,我的带有字符串参数的函数在 VBA 中调用时有效,但仅在第一次调用之后。因此,当我BSTR*第一次使用来自 dylib 的参数调用函数时(在我启动应用程序后,在本例中为 Excel),BSTR*指针只指向某个(随机?)地址,而不是字符串。当我第二次从 VBA 调用该函数时,一切正常 - 任何想法为什么会这样?!

0 投票
2 回答
1133 浏览

c++ - 阿拉伯语文本的 BSTR 到 CString 转换

我的 VC++ (VS2008) 项目使用多字节字符集。

我有以下代码将日期字符串转换为 COleDateTime

此代码适用于所有区域设置,但在阿拉伯语区域设置中失败,输入日期为以下格式:21/05/2012 11:50:31م

转换后,CString 包含垃圾字符,解析失败:01/05/2012 11:50:28ã

是否有适用于阿拉伯语设置的 BSTR 到 CString 的转换?

0 投票
1 回答
2369 浏览

c++ - 通过本机字符串创建 BSTR(使用 _bstr_t 包装器)时,如何设置长度?

创建BSTR(用作包装类)时,_bstr_t我必须使用. _bstr_t由于 aBSTR是可能包含空字符的长度前缀字符串,因此必须有可能使用本地字符串创建这样的字符串,而不依赖于给定本地字符串的空终止。

举个例子:

问题是构造函数依赖于pwNativeString. 所以结果BSTR只是"abc"而已。所以我的问题是:如何创建一个BSTR_bstr_t并传递一个指向具有特定长度的数组的指针?下面是一个伪代码示例:

0 投票
2 回答
457 浏览

c - C: int 到 _bstr_t

我正在尝试使用 c 在 excel 中绘制一系列图。问题是当我尝试在循环中制作绘图时,我必须在 excel 中更改工作表的名称。但这些名称采用 _bstr_t 格式:

我想让 name 看起来像 ("Sheet number %d",i),其中 i 是计数器。我尝试使用 sprintf 和其他方法,但没有运气。

任何帮助,将不胜感激!

0 投票
4 回答
2384 浏览

c++ - 将 BSTR 存储在 std::vector 中?

我有一个 ATL COM 组件方法,它将 BSTR 作为 in 参数。我需要在一个数组中添加对该方法的每个调用。我不能使用 SAFEARRAY,因为它是固定大小的,所以我认为 std::vector 将是最简单的选择。当然,我需要为向量的每个添加调用 SysAllocString。这意味着在销毁向量之前,需要为每个条目调用 SysFreeString。

我正在寻找一个更简单/更清洁的解决方案,并考虑将向量声明为 vector<_bstr_t> ,其中包括自动清理。然而,在我的脑海里,有一些事情正在引发警报,因为它实际上是一个标准容器中的智能指针。我的担心是合理的还是我可以安全地做到这一点?如果没有,还有其他更好的解决方案吗?