一起討論一個BSTR型別轉換問題 (轉)

worldblog發表於2007-12-12
一起討論一個BSTR型別轉換問題 (轉)[@more@]

[總結和翻譯自MSDN]
[BSTR和字串操作]

 1. 使用_bstr_t解決問題

  COM當中一個重要的主題就是維護 BSTR 型別變數. 在一些情況下(主要是傳遞或者複製 BSTR 型別資料的時候)會產生一些問題:
  * 不能接收 BSTR 型別的變數引數
  * 複製 BSTR 型別資料的時候導致記憶體洩漏

  通常使用 _bstr_t 可以解決這些問題, 這個物件封裝了 BSTR 資料型別, 自動進行資源的分配合管理, 並且提供一個自動的資料型別轉換操作.

  注意: 使用強制型別轉換 _bstr_t 的方式對於 Unicode 連結是不適用的, 需要使用 模式連結.

  此外, 這裡也有一個記憶體管理的問題, 使用賦值模式就會產生記憶體洩漏:
  BSTR tmpBStr;
  m_p1->get_ObjectString(&tmpBStr);
  _bstr_t tmpbstr;
  tmpbstr= tmpBStr; //記憶體洩漏
  SetDlgItemText(IDC_CURPROPVAL, tmpbstr);

  在 tmpbstr 變數初始化的時候發生洩漏, 函式 SysAllocString 在建立 tmpbstr 變數的時候被自動. 這個新申請的資源以後不會釋放, 導致記憶體洩漏.

 2. BSTR 資料型別
 1) BSTR , LPWSTR 和 LPSTR
  LPSTR 就是我們日常使用的一個MFC的char*指標的宏定義, LPWSTR 比 LPSTR 多一倍的資源使用, 因為它和漢字一樣使用雙位元組表達一個字元, BSTR 則額外多一個資訊頭部存放資料長度.

 2) 如何將LPSTR/LPCTSTR轉換成為BSTR/LPWSTR
  其實MFC/ATL提供了一組宏定義用於轉換這些資料型別, 因為需要先使用USES_CONVERSION;宏, 裡面呼叫了_alloc申請並且自動釋放需要的資源, 為此你不必擔心前面提到的記憶體維護問題:
  A2BSTR  OLE2A  T2A  W2A
  A2COLE  OLE2BSTR T2BSTR W2BSTR
  A2CT  OLE2CA  T2CA  W2CA
  A2CW  OLE2CT  T2COLE W2COLE
  A2OLE  OLE2CW  T2CW  W2CT
  A2T  OLE2T  T2OLE  W2OLE
  A2W  OLE2W  T2W  W2T

  或者你可以使用MSDN裡面的一個無法透過提到的兩個函式實現字串到BSTR的轉換

  //使用 /Gr 或者 /Gz 編譯開關, 或者包含一個 comsupp.lib 就行了
  #include
  int main()
  {
  char sz[]="hello";
  _bstr_t b;
  b = _com_util::ConvertStringToBSTR(sz);
  char * p = _com_util::ConvertBSTRToString(b);
  return 1;
  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991889/,如需轉載,請註明出處,否則將追究法律責任。

相關文章