MFC ActiveX コントロール : ActiveX コントロールの配布
更新 : 2007 年 11 月
ここでは、ActiveX コントロールの再頒布に関する次のようなトピックについて説明します。
ANSI バージョンと Unicode バージョンのコントロール
ActiveX コントロールと再頒布できる DLL のインストール
コントロールの登録
メモ : ActiveX コントロールの再頒布に関する追加情報については、「コントロールを再頒布する」を参照してください。
ANSI バージョンと Unicode バージョンのコントロール
ANSI バージョンと Unicode バージョンのどちら (または両方) のコントロールを用意するのかを決定する必要があります。決定の基準となるのは、ANSI 文字セットと Unicode 文字セットの移植性に関する特性です。
ANSI コントロールは、すべての Win32 オペレーティング システムで動作するため、さまざまな Win32 オペレーティング システム間で最大限の移植性が保証されます。これに対して、Unicode コントロールが動作するのは Windows NT (Version 3.51 以降) だけであり、Windows 95 や Windows 98 では動作しません。移植性が重視される場合は、ANSI コントロールにすることをお勧めします。Windows NT 専用のコントロールについては、Unicode コントロールでもかまいません。また、両方のバージョンを用意して、ユーザーのオペレーティング システムに適した方がインストールされるようにすることもできます。
ActiveX コントロールと再頒布できる DLL のインストール
ActiveX コントロールと一緒に提供するセットアップ プログラムは、Windows フォルダの下に専用のサブフォルダを作成し、そこにコントロールの .OCX ファイルをインストールするように動作させる必要があります。
メモ : |
---|
セットアップ プログラムで Windows フォルダの名前を取得するには、Windows API の GetWindowsDirectory を使用します。サブフォルダには、会社や製品の名前を付けることができます。 |
セットアップ プログラムでは、再頒布できる DLL ファイルのうち必要なものを Windows のシステム フォルダにインストールします。インストールしようとしている DLL ファイルがユーザーのコンピュータに既に存在する場合は、ファイルのバージョンがセットアップ プログラムによって比較されます。既存のファイルのバージョンが古い場合にだけ、ファイルがインストールされます。
ActiveX コントロールを使用できるのは OLE コンテナ アプリケーションだけなので、すべての OLE DLL をコントロールと一緒に配布する必要はありません。通常は、コンテナ アプリケーションまたはオペレーティング システムに標準の OLE DLL がインストールされています。
コントロールの登録
コントロールを使用する前に、Windows レジストリ データベースに適切なエントリを作成する必要があります。ActiveX コントロール コンテナに、ユーザーが新しいコントロールを登録するためのメニュー項目が用意されている場合もありますが、すべてのコンテナにこのような登録機能が備わっているわけではありません。したがって、インストール時にセットアップ プログラムでコントロールを登録することをお勧めします。
このほか、コントロールを直接登録するセットアップ プログラムを自分で記述することもできます。
まず、Windows API の LoadLibrary を使ってコントロールの DLL を読み込みます。次に、GetProcAddress を使って "DllRegisterServer" 関数のアドレスを取得します。最後に、DllRegisterServer 関数を呼び出します。次のコードは、コントロールを直接登録する方法の一例です。hLib にはコントロールのライブラリのハンドルが格納され、lpDllEntryPoint には "DllRegisterServer" 関数のアドレスが格納されます。
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
AfxMessageBox(IDS_LOADLIBFAILED); //unable to load DLL
iReturn = FAIL_LOAD; //unable to load DLL
}
// Find the entry point.
lpDllEntryPoint = GetProcAddress(hLib, "DllRegisterServer");
if (lpDllEntryPoint != NULL)
(*lpDllEntryPoint)();
else
;// Unable to locate entry point
コントロールを直接登録する場合は、別のプロセス (REGSVR32) を呼び出したり読み込んだりする必要がないため、インストール時間を短縮できます。また、セットアップ プログラムでは、登録が内部プロセスになるため、外部プロセスの場合よりもエラーや予想外の状況を柔軟に処理できるようになります。
メモ : |
---|
セットアップ プログラムでは、ActiveX コントロールをインストールする前に OleInitialize を呼び出す必要があります。また、セットアップ プログラムの終了時には、OleUnitialize を呼び出します。これにより、OLE システム DLL が、ActiveX コントロールを登録できる状態になります。 |
さらに、MFCx0.DLL を登録する必要があります。