草庐IT

c++ - 如何将 BSTR 传递给 printf?

我有一个使用VS2013构建的非unicode(MBCS)C++项目。给定一个BSTR值,我应该如何安全地将它传递给printf? 最佳答案 BSTR实际上是一个带有前置长度信息的WCHAR*。出于打印目的,您可以忽略该长度部分。所以:BSTRstr=foo();printf("%S",str);//CapitalS 关于c++-如何将BSTR传递给printf?,我们在StackOverflow上找到一个类似的问题: https://stackoverflo

c++ - 我们应该将 COM 中的 BSTR 类型视为值还是引用?

从ATLInternals一书中,我知道BSTR不同于OLECHAR*,BSTR有CComBSTR和CString。根据MSDNAllocatingandReleasingMemoryforaBSTR,我知道调用者/被调用者的内存管理责任。从MSDN中获取这一行,HRESULTCMyWebBrowser::put_StatusText(BSTRbstr)我仍然不知道如何在我的实现中正确处理bstr。因为我仍然有一个关于BSTR的基本问题——我们应该将bstr视为一个值(如int)还是一个引用(如int*),至少在COM接口(interface)边界上。我想在我的实现中尽快将BSTR转换

c++ - 检查 BSTR 是否为空

我有一个包含BSTR的变体,但有时BSTR为“”(空),那么如何避免这种情况?我试过类似的东西:variant.bstrVal!=NULL但是没有用。 最佳答案 使用SysStringLen:if(SysStringLen(variant.bstrVal)==0){...} 关于c++-检查BSTR是否为空,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7408574/

c++ - 如何有效地将 BSTR 复制到 wchar_t[]?

我有一个BSTR对象,我想将其转换为复制到wchar__t对象。棘手的是BSTR对象的长度可能在几千字节到几百千字节之间。是否有一种有效的方式来复制数据?我知道我可以只声明一个wchar_t数组并始终分配它需要保存的最大可能数据。然而,这意味着为可能只需要几千字节的数据分配数百KB的数据。有什么建议吗? 最佳答案 首先,如果您需要做的只是阅读内容,您实际上可能根本不需要做任何事情。BSTR类型已经是指向空终止wchar_t数组的指针。事实上,如果您查看标题,您会发现BSTR本质上定义为:typedefBSTRwchar_t*;因此,

c# - 使用 COM 互操作将 BSTR 从 C++ 编码到 C#

我有一个用C++编写的进程外COM服务器,它由一些C#客户端代码调用。服务器接口(interface)之一上的方法向客户端返回一个大的BSTR,我怀疑这是导致内存泄漏的原因。代码有效,但我正在寻求有关编码BSTR的帮助。稍微简化一下,服务器方法的IDL是HRESULTProcessRequest([in]BSTRrequest,[out]BSTR*pResponse);实现看起来是这样的:HRESULTMyClass::ProcessRequest(BSTRrequest,BSTR*pResponse){USES_CONVERSION;char*pszRequest=OLE2A(req

c++ - 如何将 std::string 转换为 BSTR*?

如何将std::string转换为BSTR*?STDMETHODIMPCMyRESTApp::rest(BSTRdata,BSTR*restr){RESTClientrestclient;RESTClient::responseresp=restclient.get(data);Log("ResponseStatuscode:%s",resp.code);Log("ResponseBody:%s",resp.body);*restr=//herereturnS_OK;}我需要转换resp.body,然后将其返回给此处的*restr。 最佳答案

c++ - 变体 bstr 到 std::string 转换的默认编码

我有一个从MSXMLDOM中提取的变体bstr,所以它是UTF-16格式的。我试图找出此转换发生的默认编码:VARIANTvtNodeValue;pNode->get_nodeValue(&vtNodeValue);stringstrValue=(char*)_bstr_t(vtNodeValue);根据测试,我认为默认编码是Windows-1252或Ascii,但我不确定。顺便说一句,这是我正在修复并将变体转换为wstring并通过调用WideCharToMultiByte进行多字节编码的代码块。谢谢! 最佳答案 operator

c# - 从 C# 将 BSTR 传递到 COM 函数的约定(COM 互操作)

我正在用C++在COM中编写一个API,并在C#中编写一个使用此API的程序。我的问题是关于将BSTR传递到COM函数时的BSTR内存管理语义。假设我的IDL看起来像:HRESULTSomeFunction([in]BSTRinput);目前这个功能是这样实现的:HRESULTSomeFunction(BSTRinput){//Dostuff...,then:SysFreeString(input);}当我从C#中使用类似SomeFunction(myString)的东西调用它时,C#会生成这样的东西(伪代码):myString=SysAllocString("string");Som

c++ - BSTR 能否容纳需要超过 16 位来表示的字符?

我对WindowsBSTR和WCHAR等感到困惑。WCHAR是一个16位字符,旨在允许使用Unicode字符。那些需要超过16位来表示的字符呢?一些UTF-8字符需要更多。这是Windows的限制吗?编辑:感谢您的所有回答。我想我了解Unicode方面。不过,我仍然对Windows/WCHAR方面感到困惑。如果WCHAR是16位字符,Windows是否真的使用其中的2个来表示大于16位的代码点,或者数据是否被截断了? 最佳答案 UTF-8不是Windows的BSTR或WCHAR类型中使用的编码。相反,他们使用UTF-16,它使用1个

windows - 如何最好地将 CString 转换为 BSTR 以将其作为 "in"参数传递给 COM 方法?

我需要将CString实例转换为正确分配的BSTR并将该BSTR传递给COM方法。为了让代码能够为ANSI和Unicode编译和工作,我使用CString::AllocSysString()将任何格式的CString转换为UnicodeBSTR。因为没有人拥有返回的BSTR,所以我需要处理它并在调用完成后以尽可能少的代码以尽可能少的异常安全方式释放它。目前我使用ATL::CComBSTR进行生命周期管理:ATL::CComBSTRconverted;converted.Attach(sourceString.AllocSysString());//simplyattachestoBST