呂思偉----潘愛民::ATL紹介(二)


ATL紹介(二)呂思偉--潘愛民
----(前期に続く)
----C++言語におけるテンプレートクラスの定義形式は次のとおりです.
template < class T >
class MyTemp
{
      MyTemp< T >( ) { };
      ~MyTemp< T >( ) { };
     int MyFunc( int a) ;
}
 … …
Int MyTemp< T >::MyFunc( int a)
{
}

----まずC++のキーワード「template」を使用してテンプレートクラスの定義を宣言します.キーワードの後ろには、カッコで囲まれたタイプのパラメータがあります.このタイプのパラメータに基づいて、コンパイラはコンパイル中にテンプレートクラスの具体的な定義を実際のクラスの定義に変換することができます.つまり、新しいクラスを生成します.次の定義は、通常のクラス定義とよく似ていますが、クラスの関数定義にはタイプパラメータの説明が必要です.
----次の手順では、テンプレート・クラスの使用方法を説明します.
typedef MyTemp< MyClass > myclassfromtemp;
myclassfromtemp m;
int a = m.Myfunc(10);

----通常、テンプレートクラスを使用する場合は、便宜上、キーワード「typedef」を使用して、新しく定義されたクラスの名前を付けます.上記の手順では、「MyClass」がユーザー定義のクラスであると仮定し、このクラスの名前をタイプパラメータとしてテンプレートクラスに渡すことで、テンプレートクラスの定義に基づいて新しいクラスを作成することができます.たとえば、テンプレートクラス定義のすべてのメンバー関数があり、ユーザーが提供するタイプパラメータによって実現されるテンプレートクラスの動作の変更です.テンプレートクラスに異なるタイプのパラメータを付与すると、動作フレームワークが似ているが具体的な動作が異なるクラスのセットが得られる.新しいクラスの定義があれば、通常のクラスと同様にクラスのインスタンス、すなわち新しいオブジェクトを作成し、そのオブジェクトのメンバー関数を呼び出すことができます.
----テンプレートクラスは標準C++言語に対する最新の拡張であり、その機能は非常に強いが、テンプレートクラスをうまく使うには言語とプログラミングに関する経験と知識がかなり必要であり、またテンプレートクラスを誤って使用することはプログラムの構造と運行効率に大きな副作用をもたらす.そのため、一般的なプログラミング環境とプログラミング書籍はテンプレート類の使用に慎重な態度を取っている.ATLの核心は数十個のテンプレートクラスから構成されており、ATLのソースコードを研究することで、テンプレートクラスの使用を比較的全面的に認識することができます.
----マルチ継承技術はテンプレートと同様、C++言語の中で論争的な技術である.マルチ継承テクノロジーを使用すると、プログラムの設計と実現をより柔軟にすることができますが、マルチ継承の複雑さと自身の概念上のいくつかの問題により、マルチ継承は様々なオブジェクト向け言語環境でサポートされることが限られています.例えばSmall Talkはマルチ継承を全く許さず,MFCもマルチ継承技術をサポートしない.
---継承の最大の問題はいわゆる「ダイヤモンド構造」である.たとえば、次のコードがあります.
class A
{
    ......
};
class B : public A
{ 
   ......
};
class C : public A
{
   ......
};
class D : public C,B
{
   ......
}


----クラスDはクラスCとクラスBから同時に継承されるため、次の文で曖昧になります.
D* pD = new D;
(A*)pD- >Func(...);

----クラスDはクラスCとクラスBによってそれぞれクラスAを継承しているため,ここでの強制転化は曖昧になる.
----ATLは、C++の最新仕様に追加された2つの演算記号static_を使用しています.cast、dynamic_castは単純な強制変換に代わって,多継承による曖昧さを解消する.この2つの演算記号を使用すると、オブジェクトの実行中にオブジェクトのタイプ情報を取得できます.上のコードは、次のように変更できます.
D* pD = new D;
static_cast< A* >(static_cast< B* >(pD))- >Func(...);

----テンプレートクラスとマルチ継承テクノロジーがATLの主なツールになるのはなぜですか?なぜなら、テンプレートを採用することで、コンパイル中にユーザーカスタマイズ機能を持つクラスを迅速に生成することができ、COMのような複雑な技術体系の実現効率が大幅に向上するからである.テンプレートクラスを使用することで、ユーザーは自分が開発したクラスの基本論理に集中することができ、自分のクラスの設計が完了した後、異なるクラスを継承し、異なるテンプレートクラスを生成することで、COMの機能を迅速に実現することができる.同時に、単一継承構造の採用による多くの機能冗長性を回避します.
----つまり、設計実現の過程でテンプレート類とマルチ継承技術を採用したからこそ、ATLはコンパクトで柔軟なCOM開発ツールとなり、開発者のCOM応用開発に対する様々な需要に適応することができる.
三、ATL基本使用
----このセクションでは、ATLの基本的な使用手順について重点的に説明します.ATLはすでにMicrosoft Visual StudioのVisual C++開発環境に統合されているため、ATLを使用するにはVisual C++をインストールする必要があります.以下のディスカッションでCOMの基本的な知識については、詳細については、関連ドキュメントを参照してください.MicrosoftWindows 98プラットフォームにおけるVisual Studio 6.0の使用例を示す図である.
----ATLを使用してCOMアプリケーションを開発するには、基本的に以下のステップに分けることができます.
  • 新しいATLプロジェクトを作成し、プロジェクトのオプションを適切に構成します.
  • 新しく作成されたプロジェクトに新しいATLクラスを追加し、そのクラスの初期構成作業を行います.
  • COMアプリケーションの基本的な要件に従って、新しいATLクラスに新しいインタフェース定義を追加し、対応するインタフェースメンバー関数を実現する.
  • 接続工事をコンパイルし、COMアプリケーションを登録する.

  • これらの手順に従って、ATLの基本的な使用手順を順に説明します.
    ---- 1. プロジェクトの作成
    ----まずVisual C++統合開発環境を起動し、「File」メニューの下の「New...」を選択するコマンドで、図1に示すように、「New」ダイアログ・ボックスで「Project」ページを選択します.
    図1新しいエンジニアリングインタフェースの概略図を作成する
    ----ATLプロジェクトを作成するAppWizardウィザードのエントリであるATL COM AppWizardを選択します.次に「プロジェクトname」編集ボックスにプロジェクトの名前を入力し、「OK」ボタンをクリックしてAppWizardダイアログボックスに入ります.図2に示すように.
    図2 ATL COM AppWizardダイアログ概略図
    ----AppWizardダイアログボックスの主な設定オプションは次のとおりです.
    ----■COMサービスプログラムのタイプ:
    ----動的接続ライブラリ(Dynamic Linking Library)は最終的に動的接続ライブラリ(DLL)形式のCOMサービスプログラムを生成する.
    ----アプリケーション(Executableアプリケーション)は最終的に実行可能プログラムタイプ(EXE)のCOMサービスプログラムを生成する.
    ----NTサービス(NT Service)は、NTサービス方式で実行されるCOMサービスプログラムを生成する.
    ----■Proxy/Studioコードの埋め込みを許可します.Microsoftが提供するMIDLでIDLファイルをコンパイルした後、オブジェクトスケジューリング用に生成されます(Marshaling)のProxy/stubのコード.従来の方式では、この部分のコードはCOMサービスプログラムのコードとは分離されているが、新しいCOM規格はマルチスレッド環境におけるCOMオブジェクトサービスをサポートするため、動的接続ライブラリのCOMサービスプログラムにおいてもProxy/stubのサポートが必要である.ATLは、生成されたDLLコードにProxy/stubのコードを含めることをユーザに選択させるネットワーク上での伝送を可能にする.このオプションはEXEとNTのサービスタイプのCOMアプリケーション条件では選択できません.◎(未完待機)