Chapter 2.
IShellDispatch



今回は、全く、COMに付いて知らない人のために、使い方について解説します。 前回は、COMは、普及してきていると書きましたが、どこに、普及しているかまでは、書きませんでした。
その普及している場所は、なんと、WindowsのOSの機能の一部となっているのです。
今回は、そのOSの一部を利用しているCOMについて、解説します。



一般的に、COMの公開されいる機能をインターフェースと呼びます。
表題にもなっている、IShellDispatchのIとは、インターフェース(Interface)の頭文字Iなのです。
IShellDispatchとは、Windowsのシェル機能にアクセスするインターフェースです。

『ファイル名を指定して実行』ダイアログボックス
↑『ファイル名を指定して実行』ダイアログボックスや

『ファイルやフォルダの検索』のダイアログボックス
↑『ファイルやフォルダの検索』のダイアログボックスを表示したりする機能のことです。



とりあえず、コードを見てみましょう。VC++と同じ配色にしています。
#include <shlobj.h>

int main(void)
{

	IShellDispatch	*pDispatch;

	// COM初期化の決まり文句
	CoInitialize(NULL);

	// インターフェースを使用するための決まり文句。
	if (CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC, IID_IShellDispatch,
		(void **)&pDispatch) == S_OK)
	{
		// 『ファイル名を指定して実行』ダイアログボックスを表示します。
		pDispatch->FileRun();

		// 『ファイルとフォルダの検索』ダイアログボックスを表示します。
		pDispatch->FindFiles();

		// 使い終わったインターフェースを開放します。
		pDispatch->Release();
	}

	// COM終了処理の決まり文句
	CoUninitialize();

	return 0;

}



このソースをパッと見た感じでは、クラスへのポインタを関数(CoCreateInstance)に渡して、関数側で、newしてもらうようなイメージですが、 インターフェースは、純粋抽象基本クラスであるため、newできません。以下のコードは、コンパイルエラーになります。
	IShellDispatch	*pDispatch;

	pDispatch = new IShellDispatch; //←ここでコンパイルエラー
コンパイルエラーになる理由についてはあえて説明しません。次章からは、COMがどのような設計思想になっているかを解説していきます。
COMのAPIである、CoInitialize、CoUninitialize、CoCreateInstanceについては、 Chapter.9『COMに使われる諸技術』を参照してもらう予定です。現時点では、MSDN等で内容を確認して下さい。



ソースをコンパイル&リンク(これ以降、単純に"ビルド"と呼ぶ)後に、実行してみると、上記二つのダイアログボックスが表示されるかと思います。 表示されない方は、Internet Explorerのバージョンが古いことが考えられますので、バージョンが3.0以降のものをインストールして下さい。 また、ビルドできない方(多数いると思います)は、最新のWin32SDKとActiveX SDKをダウンロードしてインストールしてみて下さい。 ダウンロードが無理とか嫌な方のために、少し、反則的なサンプルソースも用意しましたので、そちらをご覧下さい。
C++用ソース:chap2.cpp(1KB未満)
C用ソース:chap2.c(1KB未満)
VB用ソース:chap2.bas(1KB未満)
反則的なC++用ソース:chap2_illegal.cpp(1KB未満)


前へ 次へ
COM研究室へ
総合トップへ