BSTRの操作
ActiveXを作成する際、文字列は BSTR をよく使います。
なので、BSTR の操作方法の説明をいたします。
BSTR は、 OLECHAR * と同じです。
OLECHAR は、 wchar_t と同じです。
しかし、BSTR は、SysXXX API () を使用して操作するのが一般的です。
メモリの初期化は、引数にwchar_t *文字列を指定し、SysAllocString () APIを使用します。
メモリを解放するには、SysFreeString () APIを使用します。
文字列の長さを取得するには、SysStringLen () APIを使用します。
文字のバイト数を取得するには、SysStringByteLen () APIを使用します。
以下、サンプルになります。
■■■ bstr プロジェクト
■ main.cpp
//BSTR のサンプル
#include <windows.h>
#include <tchar.h>
#include <limits>
// エントリポイント
int WINAPI _tWinMain ( HINSTANCE,
HINSTANCE,
_TCHAR *,
int )
{
// 以下2つとも同じ
const OLECHAR cwsz[] = OLESTR ( "こんにちは!元気?" );
// const wchar_t cwsz[] = "こんにちは!元気?";
// BSTR 作成
BSTR bstrData = NULL;
bstrData = SysAllocString ( cwsz );
// BSTR 文字の長さ取得
UINT nLength = SysStringLen ( bstrData );
// BSTR 文字のバイト数取得
UINT nBytes = SysStringByteLen ( bstrData );
// 試しに 文字の長さ と 文字のバイト数 を表示
char *pszLength = new char[ std::numeric_limits < UINT >::digits10 + 1 ];
wsprintf ( pszLength, "%u", nLength );
MessageBox ( NULL,
pszLength,
"文字の長さ",
MB_OK );
delete[] pszLength;
char *pszBytes = new char[ std::numeric_limits < UINT >::digits10 + 1 ];
wsprintf ( pszBytes, "%u", nBytes );
MessageBox ( NULL,
pszBytes,
"文字のバイト数",
MB_OK );
delete[] pszBytes;
// char * 文字列へ変換
int nMultiLength = WideCharToMultiByte ( CP_ACP,
0,
bstrData,
-1,
NULL,
0,
NULL,
NULL );
char *pszBuffer = new char[ nMultiLength ];
memset ( pszBuffer, 0, nLength * sizeof ( char ) );
WideCharToMultiByte ( CP_ACP,
0,
cwsz,
-1,
pszBuffer,
nMultiLength,
NULL,
NULL );
MessageBox ( NULL,
pszBuffer,
"確認",
MB_OK );
delete[] pszBuffer;
// BSTR 解放
SysFreeString ( bstrData );// bstrData == NULLでも通る
return 0;
}
|
|