Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连接两个BSTR的最佳方式是什么?_C++_Visual C++_Com - Fatal编程技术网

C++ 连接两个BSTR的最佳方式是什么?

C++ 连接两个BSTR的最佳方式是什么?,c++,visual-c++,com,C++,Visual C++,Com,我尝试了几种不同的方法来连接两个BSTR,但还没有找到一种gopd方法。我还没有在网上找到任何东西。您应该使用像ATL这样的包装器,它也可以为您处理资源管理 如果没有包装,您必须执行以下操作: BSTR Concat(BSTR a, BSTR b) { auto lengthA = SysStringLen(a); auto lengthB = SysStringLen(b); auto result = SysAllocStringLen(NULL, lengthA

我尝试了几种不同的方法来连接两个BSTR,但还没有找到一种gopd方法。我还没有在网上找到任何东西。

您应该使用像ATL这样的包装器,它也可以为您处理资源管理

如果没有包装,您必须执行以下操作:

BSTR Concat(BSTR a, BSTR b)
{
    auto lengthA = SysStringLen(a);
    auto lengthB = SysStringLen(b);

    auto result = SysAllocStringLen(NULL, lengthA + lengthB);

    memcpy(result, a, lengthA * sizeof(OLECHAR));
    memcpy(result + lengthA, b, lengthB * sizeof(OLECHAR));

    result[lengthA + lengthB] = 0;
    return result;
}

int main()
{
    auto a = SysAllocString(L"AAA");
    auto b = SysAllocString(L"BBB");
    auto c = Concat(a, b);
    std::wcout << a << " + " << b << " = " << c << "\n";

    SysFreeString(a);
    SysFreeString(b);
    SysFreeString(c);
}
BSTR混凝土(BSTR a、BSTR b)
{
自动长度=系统长度(a);
自动长度b=SysStringLen(b);
自动结果=SysAllocStringLen(NULL,lengthA+lengthB);
memcpy(结果,a,长度*sizeof(鹰嘴));
memcpy(结果+长度,b,长度*尺寸(鹰嘴));
结果[lengthA+lengthB]=0;
返回结果;
}
int main()
{
自动a=SysAllocString(L“AAA”);
自动b=系统分配字符串(L“BBB”);
自动c=Concat(a,b);

std::wcout您应该使用像ATL这样的包装器,它也可以为您处理资源管理

如果没有包装,您必须执行以下操作:

BSTR Concat(BSTR a, BSTR b)
{
    auto lengthA = SysStringLen(a);
    auto lengthB = SysStringLen(b);

    auto result = SysAllocStringLen(NULL, lengthA + lengthB);

    memcpy(result, a, lengthA * sizeof(OLECHAR));
    memcpy(result + lengthA, b, lengthB * sizeof(OLECHAR));

    result[lengthA + lengthB] = 0;
    return result;
}

int main()
{
    auto a = SysAllocString(L"AAA");
    auto b = SysAllocString(L"BBB");
    auto c = Concat(a, b);
    std::wcout << a << " + " << b << " = " << c << "\n";

    SysFreeString(a);
    SysFreeString(b);
    SysFreeString(c);
}
BSTR混凝土(BSTR a、BSTR b)
{
自动长度=系统长度(a);
自动长度b=SysStringLen(b);
自动结果=SysAllocStringLen(NULL,lengthA+lengthB);
memcpy(结果,a,长度*sizeof(鹰嘴));
memcpy(结果+长度,b,长度*尺寸(鹰嘴));
结果[lengthA+lengthB]=0;
返回结果;
}
int main()
{
自动a=SysAllocString(L“AAA”);
自动b=系统分配字符串(L“BBB”);
自动c=Concat(a,b);

std::wcout您可以使用
包装器:

#include <comutil.h>

#pragma comment(lib, "comsupp.lib")

// you have two BSTR's ...
BSTR pOne = SysAllocString(L"This is a ");
BSTR pTwo = SysAllocString(L"long string");

// you can wrap with _bstr_t
_bstr_t pWrapOne = pOne;
_bstr_t pWrapTwo = pTwo;

// then just concatenate like this
_bstr_t pConcat =  pWrapOne + pWrapTwo;
#包括
#pragma注释(lib,“compp.lib”)
//你有两个BSTR。。。
BSTR pOne=系统分配字符串(L“这是一个”);
BSTR pTwo=系统分配字符串(L“长字符串”);
//你可以用_bstr\t包装
_bstr_t pWrapOne=pOne;
_bstr_t pWrapTwo=pTwo;
//然后像这样连接
_bstr_t pConcat=pWrapOne+pWrapTwo;

您可以使用
\u bstr\t
包装器:

#include <comutil.h>

#pragma comment(lib, "comsupp.lib")

// you have two BSTR's ...
BSTR pOne = SysAllocString(L"This is a ");
BSTR pTwo = SysAllocString(L"long string");

// you can wrap with _bstr_t
_bstr_t pWrapOne = pOne;
_bstr_t pWrapTwo = pTwo;

// then just concatenate like this
_bstr_t pConcat =  pWrapOne + pWrapTwo;
#包括
#pragma注释(lib,“compp.lib”)
//你有两个BSTR。。。
BSTR pOne=系统分配字符串(L“这是一个”);
BSTR pTwo=系统分配字符串(L“长字符串”);
//你可以用_bstr\t包装
_bstr_t pWrapOne=pOne;
_bstr_t pWrapTwo=pTwo;
//然后像这样连接
_bstr_t pConcat=pWrapOne+pWrapTwo;

“魔兽世界”是最简单的方法来勾引2个字符串。我习惯于C,在那里它只是收敛+Bstring;没有现有的方法来实现这个吗?哇!!!C++!sucks@user565660
BSTR
糟透了。
BSTR
是一个基于C的接口。可以像字符串一样给你赋值的包装器存在,但不是
BSTR
s。@user565660:再说一次“C++糟透了”,它就会射到你的脚上。是的,以低俗小说电影的方式。@Hansmad将数组的最后一个位置设置为0的原因是什么(结果[lengthA+lengthB]=0;)哇,这真的是最简单的方法来勾引2个字符串。我习惯于C,在那里它只是收敛+ Bstring;没有现有的方法来做到这一点?哇!!!C++!sucks@user565660
BSTR
糟透了。
BSTR
是一个基于C的界面。可以像字符串一样给你赋值的包装器存在,但不是
BSTR
s。@user5660:再次说“C++糟透了”,它就来了,射中了你的脚。是的,以低俗小说电影的方式。@Hansmad将数组的最后一个位置设置为0(result[lengthA+lengthB]=0;)的原因是什么?pOne和pTwo不是BSTR。你必须使用SysAllocX函数来获得真正的BSTR(它们有一个4字节长的“前缀”,类似于)@manuell我的回答正确了!非常感谢,我已经修改了我的答案。以前的版本确实可以编译,但不起作用,只是。pOne和pTwo不是BSTR。你必须使用SysAllocX函数来获得真正的BSTR(它们有一个4字节长的“前缀”,有点)@曼努埃尔:我站在正确的位置!非常感谢,我已经修改了我的答案。以前的版本确实可以编译,但不起作用,只是。