问题标签 [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.
c++ - 为什么选择 BSTR 以及如何将其转换为 QString?
我正在使用函数返回 BSTR 的 Microsoft Kinect SDK。我需要得到一个 QString 或 std::string。
这是我尝试过的:
使用此解决方案,程序崩溃。使用注释掉的行,我得到“未解析的外部符号 SysStringLen”。
SysStringLen 是要走的路,但我需要添加一些额外的库(API 不会已经包含它)还是有其他解决方案?
附加问题:微软为什么要这样做?我是说:
这样的事情背后的原因是什么?即使他们发现在内部使用它是有益的,他们难道不能在 API 中使用普通的 char 数组或 std::(w)string 来让其他人的生活更轻松吗?
c++ - WIA 2.0 - IWiaDevMgr2::GetImgDlg() - 如何声明/初始化 ppbstrFilePaths 参数
我正在尝试在我的 VS2012 C++ 库中实现一些 WIA 2.0 代码,并且遇到了IWiaDevMgr2::GetImageDlg调用的问题,特别是 ppbstrFilePaths 参数。我不太确定如何声明/初始化它。
从http://msdn.microsoft.com/en-us/library/windows/desktop/aa359932(v=vs.85).aspx的文档中:
ppbstrFilePaths [in] 类型 - BSTR**
指向已扫描文件的路径数组的指针的地址。在调用 IWiaDevMgr2::GetImageDlg 之前,将指针初始化为指向大小为零 (0) 的数组。见备注。
我已经尝试了各种不同的声明方式,但都没有成功,例如:
我也尝试过类似的事情:
谁能指出我声明和初始化此 BSTR ** 的正确方向?我不是一个大的 C++ 开发人员,在这一点上几乎是在猜测。
c++ - C++ stl 映射:BSTR 的问题
我在代码<BSTR,struct>
bstr 中使用映射作为键并构造值。
这会起作用还是我必须重新定义一些东西?
我没有看到编译问题,我也可以添加元素。但是,map.find()
不起作用。即使元素存在,它也总是返回map.end()
(未找到元素)。
我做了一个临时的解决方法如下 - 通过从map.begin()
to循环map.end()
并为每个元素执行 lstrcmpW 。这似乎有效,但不要认为这太有效了。
关于可能出错的任何建议/提示?可以BSTR
用作地图的键吗?我知道地图不支持某些非本机数据类型 - 结构或类......你需要为此定义一个<
运算符。
char - _bstr_t 到 char*,惊人的结果
第一的:
第二:
它们是相同的,但第一个条件会导致代码不可读
为什么?
c# - 尝试从 COM 组件传递 BSTR* 时 C# 中的 MarshlDirectiveException
如果我用这样的东西调用我的 COM 方法
我收到上面提到的错误。被调用的方法是这样的
只要我不为 BSTR* 分配一些值,它就可以正常工作。
编辑:IDL 描述
EDIT2:只要我只传递 1 个像 *returnme = "T" 这样的字符,它就可以正常工作。但是当它需要是一个它抛出的字符串时,即使我将一个指针分配给一个字符串,我也会得到一个错误。
c++ - 我是否需要释放由 _Type::get_FullName 填充的 BSTR
我有一些看起来像这样的代码:
我需要释放那个 bstr 吗?如何释放它SysFreeString()?如果不是为什么?
c++ - 带有 VARIANT / bstrVal 代码的 C++ 泄漏
泄漏检查器告诉我,在以下代码中分配的内存存在内存泄漏:
里面的“clsObj”是一个IWbemClassObject,它是一个微软的WMI 接口。
分配泄漏内存的特定行是“clsObj->Get”行。然后泄漏检查器报告泄漏本身的更具体的代码(即在分配泄漏内存时在堆栈跟踪中进一步),我没有源代码:
因此,VARIANT vVal 中的底层 BSTR 似乎正在泄漏。但我正在做 VariantClear ......我还需要做其他事情吗?
也许我在 wstring 构造函数中泄漏了它?但如果是这样,我不明白。我认为 bstrVal 本质上只是归结为一个 char 指针(或 wchar 或其他);wstring 构造函数应该只是从该地址复制,就好像它是任何其他指针一样,对吗?
这不像 wstring 构造函数负责清理最初由 vVal.bstrVal 指向的内存,就好像它正在对某个引用计数的 COM 对象执行 Detach() 一样,是吗?
万一这很重要,这是在 Visual C++ 6 中。
c++ - 我可以在 Windows 上使用 _bstr_t 类在多字节和 Unicode 之间进行转换吗?(C++)
BSTR
这种奇怪的 Windows 数据类型是否具有一些特定用途,例如 COM 函数。根据 MSDN,它包含一个WCHAR
字符串和一些其他内容,例如长度描述符。Windows 也很好地为我们提供了封装的_bstr_t
类BSTR
;它负责分配和解除分配,并为您提供一些额外的功能。它有四个构造函数,包括一个接受 achar*
和一个接受a 的构造函数wchar_t*
。MSDN对前者的描述: “通过调用来构造一个对象,创建一个新对象,然后封装它。这个构造函数首先进行多字节到Unicode的转换。”_bstr_t
SysAllocString
BSTR
它还具有可以提取指向字符串的指针的运算符,如、 和中的任何一个char*
,我很确定这些都是以空值结尾的,这很酷。const char*
wchar_t*
我花了一些时间阅读如何在多字节和 Unicode 之间进行转换,并且我已经看到很多关于如何使用mbstowcs
和的讨论,以及由于编码可能不同,以及wcstomb
如何更好,等等等等。这一切似乎都让人头疼,所以我想知道我是否可以构造 a并使用操作来访问字符串,这将是......更少的代码行:MultiByteToWideChar
WideCharToMultiByte
_bstr_t
我想我对此的直观回答是我们不知道 Windows 在幕后做什么,所以如果我在使用mbstowcs
/时遇到问题wcstomb
(我想我的意思是mbstowcs_s
/ wcstomb_s
)而不是MultiByteToWideChar
/ WideCharToMultiByte
,我不应该冒险,因为它是Windows 可能使用这些。(几乎可以肯定不会使用后者,因为我没有在此处指定“代码页”,不管是什么。)老实说,我还不确定我是否认为mbstowcs_s
andwcstomb_s
功能可以满足我的目的,因为我不确实掌握了所有不同的编码和东西,但这是一个完全不同的问题,它似乎在整个互联网上都得到了解决。
Sooooo,除了潜在的担忧之外,这样做有什么问题吗?
c++ - 将 BSTR 转换为 char * 的问题
我们有一个使用 WinHttp.WinHttpRequest.5.1 调用第三方 Web 服务的旧 C++ 应用程序。
我不会列出调用序列的所有细节,因为我认为它与问题无关,但我们通过调用结束hr = pIWinHttpRequest->get_ResponseText(&bstrResponse);
,其中bstrResponse
是 BSTR 类型。
调用代码不适用于 BSTR,它适用于标准 C/C++ char *
,因此代码将 BSTR 转换为 a char *
:
对于我们使用此代码访问的所有先前的 Web 服务,这已经奏效了。但对于这个新的,它不是。
我们返回的数据应该是 XML,但是对于这个 web 服务,看起来我们遇到了一些字符代码转换问题。我们得到的字符串以;"?<?xml version="1.0" encoding="utf-8"?>..."
?
注意开头的额外内容。在调试器中遍历此内容时,我们在的显示值bstrResponse
中看不到它,在 的显示值中b
也看不到它,但在 的显示值中确实看到了它c
。
关于可能发生什么的任何想法?
已编辑
我知道BSTR是多字节类型,但是这个字符串中的所有字符都是纯ASCII,调用这个函数的代码没有一个可以处理多字节字符。浏览网页,我看到经常推荐这种特定机制,但在这种情况下,它不起作用。
我需要将此字符串从 BSTR 转换为单字节字符数组。即使这意味着去除无法转换的多字节字符。
c++ - MSXML 方法是否获取其 BSTR 参数的内存所有权?
MSXML 方法是否获取其 BSTR 参数的内存所有权?
例如:load
、getElementsByTagName
或selectSingleNode
我问这个是因为我看到代码只是调用CString
'sAllocSysString()
并将其传递给 MSXML 方法而不SysFreeString()
随后调用。
编辑:
快速修复我看到的代码_bstr_t
: https ://stackoverflow.com/a/14471409/109747 (我的帖子)