2010-07-20 56 views
4

我知道我可以做創建一個帶有浮子上的_bstr_t:浮到_bstr_t

mValue = _bstr_t(flt); 

我可以先宣佈AC字符串格式浮動字符串:

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

我有點生鏽的C++,特別是當涉及到_bstr_t這是Visual Basic字符串類型的C++類包裝。 str指向的內存是否由_bstr_t對象管理? 我的問題是將float(flt)傳遞給_bstr_t的構造函數會導致浮點數33.03434變成「33,03434」,例如,如果我當前的語言集是意大利語。還有另外一種方式來聲明它嗎?

+1

'_bstr_t'封裝'BSTR',它是COM等使用的數據類型 - 它不是VB特定的數據類型。 – 2010-07-20 05:10:10

回答

2

當您使用char*的轉換創建_bstr_t實例時,會創建一個新的BSTR,該對象不會佔用由char*指向的內存。您必須自己管理由char*指向的內存。

在你的情況下,因爲你知道,有一個多久產生字符串可以是你最好的選擇的限制是分配緩衝區堆棧:

const int bufferLength = 30; 
char str[bufferLength] = {}; 
snprintf(str, bufferLength - 1, "%.7g", flt); 
mValue = _bstr_t(str); 
1

最後我用CString的,因爲它是內存管理:

CString cstr; 
cstr.Format(_T("%.7g"),flt); 
mValue = _bstr_t(cstr); 
0
_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); 
+1

你有什麼機會可以解釋什麼使得這段代碼成爲所提出問題的有效答案?一個僅有代碼的問題往往不會對那些後來剛剛發生的人有用。 – 2012-09-22 03:01:32

+0

嗯,所以問題是關於特定於語言環境的「點」。抱歉。然後'_vsnwprintf_s'應該替換爲'_vsnwprintf_s_l',傳遞適當的語言環境對象,從[_create_locale()]獲取(http://msdn.microsoft.com/en-US/library/4zx9aht2%28v=vs.80%29的.aspx)。 – 2013-06-05 19:10:09