BSTR を 普通の char 型文字列に変換する OLE2T マクロ

  実際の処理



  
//*******************************************************************
STDMETHODIMP CMyclass::MyFunction(BSTR vbsString, BOOL *pVal)
{
	USES_CONVERSION;
	LPTSTR szString = OLE2T(vbsString);

//*******************************************************************
  

USES_CONVERSION マクロは、OLE2T マクロで必要な変数が定義されています。

OLE2T で行われる処理は、意味的には以下のようなものです。

  
1) LPTSTR に必要な長さを求める
	LPCWSTR _lpw = vbsString;
	int _convert = 0;
	_convert = (lstrlenW(_lpw)+1)*2;

2) スタックにメモリを割り付ける
	LPTSTR szString = _alloca(_convert);

3) 変換関数を呼び出す
	AtlW2AHelper((LPSTR)szString, _lpw, _convert);
  

よって、OLE2T が実行されるたびに、スタック領域が消費されるのでループ内での使用や、非常に大きな文字列の使用は避けなければなりません。

AtlW2AHelper は inline で定義されています。inline は、関数コードを関数を記述した位置に埋め込むものです。コンパイル前に埋め込む文字列マクロではありません。

スタック以外に割り付けようとする場合は、

  
	LPTSTR szString = _alloca(_convert);
を
	LPTSTR szString = new char[_convert]; とすれば良いでしょう。
  

(関数の終了前に delete [] szString; で開放)










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ