плавать в _bstr_t - PullRequest
       22

плавать в _bstr_t

4 голосов
/ 20 июля 2010

Я знаю, что могу создать _bstr_t с плавающей точкой, выполнив:

mValue = _bstr_t(flt); 

И я могу отформатировать строку с плавающей точкой, сначала объявив строку ac:

char* str = new char[30];
sprintf(str, "%.7g", flt); 
mValue = _bstr_t(str);

Я являюсьнемного ржавый на c ++, особенно когда дело доходит до _bstr_t, который является оболочкой класса C ++ для строкового типа Visual Basic.Будет ли память, на которую указывает str, управляться объектом _bstr_t?Моя проблема с передачей float (flt) в конструктор _bstr_t приводит к тому, что float с номером 33.03434 превращается в "33,03434", если, например, мой текущий языковой набор - итальянский.Возможно, есть другой способ объявить это?

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Когда вы создаете экземпляр _bstr_t, используя преобразование из char*, создается новый BSTR, объект не становится владельцем памяти, на которую указывает char*. Вам придется самостоятельно управлять памятью, на которую указывает char*.

В вашем случае, поскольку вы знаете, что существует ограничение на то, как долго строка-производитель может быть вашим лучшим выбором, это выделить буфер в стеке:

const int bufferLength = 30;
char str[bufferLength] = {};
snprintf(str, bufferLength - 1, "%.7g", flt); 
mValue = _bstr_t(str);
1 голос
/ 20 июля 2010

В итоге я использовал CString, так как он управляется памятью:

CString cstr;
cstr.Format(_T("%.7g"),flt);
mValue = _bstr_t(cstr);
0 голосов
/ 13 сентября 2012
_bstr_t FormatBstr(LPCWSTR FormatString, ...)
{
    ATLASSERT( AtlIsValidString(FormatString) );
    unsigned int len = 10 + wcslen(FormatString);
    unsigned int used = 0;

    BSTR r = ::SysAllocStringLen(NULL, len);

    va_list argList;
    va_start( argList, FormatString );
    while(len < 2048) {
            used = _vsnwprintf_s(r, len+1, _TRUNCATE, FormatString, argList);
            if(used < len)
                    break;
            len += 10; // XXX
            ::SysReAllocStringLen(&r, NULL, len);
    }
    va_end( argList );
    ::SysReAllocStringLen(&r, r, used);
    return _bstr_t(r, false);
}

тогда

sprintf(str, "%.7g", flt); 
mValue = FormatBstr(L"%.7g", flt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...