概要

MSHTMLを使用してbodyタグ内のソースを取得しエディットボックスに表示します。
ここでは、googleのトップページ(http://www.google.co.jp/)を呼び出しています。
ダイアログボックスはサイズの変更に対応しています。
使い方は、プログラムを起動し読み込みをクリックするとソースが表示されます。

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32/64bit マルチバイト/UNICODE

実行環境

Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)
Windows 7 Enterprise Service Pack 1 64bit

プログラムソースの概要

htmlget1.cpp

BSTR型

BSTR型は文字列であるwchar_t[](ワイド型==UNICODE)とその文字数を表すDWORD型を示すポインタです。文字の終端には0が挿入されます。
メモリ上では下位に文字数、上位に文字列が保存されています。BSTRが示すアドレスは文字列の先頭ですので注意が必要です。これによりBSTR型を渡せば自動的にUNICODEとしてみなせるわけです。 char型の文字列はワイド型に変換してから代入します。
基本的に文字列をBSTR型に割り付けるにはSysAllocString関数を使用します。
この関数は、引数の文字列のアドレスをBSTR型に単純に代入するわけではなく、引数の文字列の文字数を調べ、新たに割り当てたメモリに文字列をコピーします。
メモリは、new演算子や_tcsdup関数の様に動的に割り当てられます。したがって、関数内で割り当てて、解放し忘れたりするなどのミスが起こりやすくなりますので注意が必要です。

割り当て方法

BSTR bstr1 = ::SysAllocString( L"test" );
BSTR bstr2 = ::SysAllocString( OLESTR("test") );
引数はワイド型なので、_TEXTマクロの使用はせず、一般的にOLESTRマクロを使用する。
char型(マルチバイト)の文字列で初期化するには、_com_util::ConvertStringToBSTR を使用する。使用には、comutil.hのインクルードとcomsupp.lib等のライブラリのリンクが必要である。このライブラリは、文字セットによりANSI版、UNICODE版、実行ファイルの形態によりリリース版とデバック版で合計4種類あるため、注意が必要である。本サンプルでは#ifdef等により使い分けている。

解放

必要がなくなれば、SysFreeString で解放します。
::SysFreeString(bstr);

文字数の取得

文字数を取得には、::SysStringLen関数を使用します。

BSTR型からUNICODE文字列を受け取る。

MessageBoxや_stprintfなどでwchar_t*が必要な場合、そのままBSTR型を指定すれば取得できます。
BSTR bstr = ::SysAllocString( OLESTR("test") );
MessaegBox(0,bstr,_TEXT("BSTR型の文字列"),MB_OK);

BSTR型からマルチバイト文字列を受け取る。

BSTR型からマルチバイト文字列に変換する関数が用意されています。
戻り値がマルチバイト文字列です。なお、マルチバイト文字列は関数内で動的にメモリに割り当てられたものなので、必要がなくなったら、delete [] で解放する必要がある。
_com_util::ConvertBSTRToString(bstr);
使用には、comutil.hのインクルードとcomsupp.lib等のライブラリのリンクが必要である。このライブラリは、文字セットによりANSI版、UNICODE版、実行ファイルの形態によりリリース版とデバック版で合計4種類あるため、注意が必要である。本サンプルでは#ifdef等により使い分けている。

_bstr_t

BSTR型をクラス化したものに、_bstr_t クラスがある。これは、BSTRの解放がクラス化によりスコープにしたがって自動的に行われれるので便利である。
関数によっては、_bstr_tが引数になっているものがある。決まった文字列であれば、_bstr_t("abc")の様にして直接渡すことができる。
+や+=演算子により_bstr_t同士の結合ができる。
_bstr_t bstrt1("西暦"); _bstr_t bstrt2("1192"); _bstr_t bstrt3=bstrt1+bstrt2; 使用には、comutil.hのインクルードとcomsupp.lib等のライブラリのリンクが必要である。このライブラリは、文字セットによりANSI版、UNICODE版、実行ファイルの形態によりリリース版とデバック版で合計4種類あるため、注意が必要である。本サンプルでは#ifdef等により使い分けている。
VARIANT型
名前のとおりあらゆる型(文字列,整数,浮動小数点)を格納できる型と言ったところでしょうか。
実態は、あらゆる型を共用体として取り込み、保存している型を示すタイプフィルド(メンバーVARTYPE vt)が設けられているというイメージでしょうか。
代入するときは、メンバーvtに型を指定し、型に対応する共用体メンバーに代入するというイメージです。

struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
//      一部省略
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
//      一部省略
            }   __VARIANT_NAME_2;
        DECIMAL decVal;
        }       __VARIANT_NAME_1;
    } ;
typedef VARIANT *LPVARIANT;
SAFEARRAY型
名前のとおりセーフな配列です。CやC++の配列と違って、配列の上限下限の情報が型に含まれているので、アクセス時に上限下限のチェックがされます。また、配列が有効化、無効化の情報を持っていますので、より安全に使用することができるわけです。

ソースコード

htmlget1.cpp


import.h


resource.h


resource.rc


実行ファイルとソースファイルのダウンロード