2013-11-14 3 views

ответ

2

Вы должны использовать обертку, такую ​​как ATL CComBSTR, которая также управляет ресурсами для вас.

без обертки вы должны сделать:

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); 
} 
+0

Wow является то, что на самом деле самым простым способом Concat 2 строки. Я привык к C#, где это будет просто aString + bString; Для этого не существует существующих методов? Вау!!! C++ отстой – user565660

+3

@ user565660 'BSTR' отстой. 'BSTR' - это интерфейс на основе C. Обертки, которые дают вам ценные строки, существуют, но не являются «BSTR's». – Yakk

+0

@ user565660: Скажите «C++ сосет» снова, и он приходит и стреляет в вас. Yeap, в * Pulp Fiction * фильм способ. – sharptooth

2

Вы можете использовать _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; 
+0

pOne и pTwo НЕ BSTR. Вы ДОЛЖНЫ использовать функции SysAllocX для получения истинных BSTR (у них есть префикс длиной 4 байта), вроде) – manuell

+0

@manuell Я стою исправлено! Большое спасибо, я внесла поправки в свой ответ. Предыдущая версия действительно компилируется нормально, но не работает, просто [как говорится здесь] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069 (v = vs.85) .aspx). –

Смежные вопросы