Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> 基本 >> BSTRの操作

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;
}
  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita