Tech Note 27: NS Basic/Palm を Microsoft .NET と共に使う Part 3

September 18, 2003


[本稿はRobert Chartier氏が15seconds.comに書かれた記事を翻訳したものです]

概略

もし今までにエンドユーザーを対象に配付するアプリケーションを開発した経験があれば、ソフトウェアが完璧に動作するために、必要事項を全て行うインストーラを作成することの重要さは分っているでしょう。Palmコンジットのために、そのようなインストーラを作成するのは簡単ではありません。ここでは、それをどう行うかをできる限り分かりやすく説明していきたいと思います。最初に、アプリケーションそのものの必要事項をリストアップします。それからコンジットを正しくインストールするための、実際に必要なことをカバーしていきます。これが一旦できたら、インストーラアプリケーションをVS .NET内のソリューションに足し、インストールのテストを行います。

インストーラに必要なもの

我々のインストーラが正しく機能するためには2つのメインセクションが必要です。1つ目は、我々のアプリケーションの必要事項(コンジットの為にどのファイルをインストールする必要があるのか、等)に対処し、2つ目は、同期プロセスの際、我々のアプリケーションが呼ばれるために、デスクトップ上でPalmアプリケーションへのコンジットの登録を行います。

アプリケーションに必要なもの
コンジットアプリケーションが正しく動作するには、いくつかの確認しなければならないものがあります。

  1. 正しいバージョンの.NET Frameworkがインストールされていること。されていない場合、インストーラは必要なバージョンのインストールを試みます。
  2. アセンブリ(PBlgConduit.exe)がターゲットマシンにあること。
  3. Palmアプリケーション(PalmBlog.prc)がターゲットマシンにあること。
  4. Palmアプリケーションのサポートファイル(NSBRuntim.prc)がターゲットマシンにあること。

コンジットに必要なもの
CDKドキュメンテーションに入っている、必要事項を導き出すためのガイドラインを示す、重要なCHMファイル("CDK403\Com\Docs\COMSyncCompanion.chm")があります。そのドキュメントのセクション4("Writing an Installer")のサブセクション("Installer Tasks")に、我々がしなくてはいけないことの多くの概念が書かれています。以下は、そのドキュメントからの概略です。

  1. ユーザのシステム上でPalmCOMInstaller.exeを起動する。このミニ・インストーラは、あなたのCOMを基礎にしたコンジットが必要とするCOM Syncオブジェクトをインストールし、Windowsにそれらを登録する。
  2. Conduit Manager、PDCondMgr.RegisterConduit、を使って、あなたのコンジットをHotSync Managerへ登録する。(すべてのコンジットに必要)
  3. (あなたのコンジットを登録した後)PDHotSyncUtility.RestartHotSyncMgrかRefreshConduitInfoを使って、HotSync Managerをリスタートまたはリフレッシュする。(すべてのコンジットに必要)
  4. PDInstall.InstallFileToHHかInstallFileToSlotを使って、次のHotSyncの時に、実機にインストールするためのデータベースまたはアプリケーション(または、実機の拡張カードにインストールするためのファイル)をキューに入れる。

必要事項を並べましたので、インストール中に上記のステップを実行するためのプロジェクトを作成します。ソリューションに、"ManagedConduitInstaller"と名前を付けて新しいC# Windowsアプリケーションを追加しましょう。私がWindowsアプリケーションを使うと決めた訳は、同期プロセスの正しいユーザを選ぶためのセレクション・ボックスを提供したいからです。時に、単一マシンでも複数のPalmデバイスユーザーに同期することはあります。

Windows FormアプリケーションのMain()メソッドを、インストール行うための我々のカスタムコードと入れ替えます。これは、オプションでダイアログを見せる能力を与えてくれます。ドキュメンテーション(COMSynchCompanion.chm)を再度参照し、"Using PDCondMgr and PDConduitInfo Objects"セクション("4. Writing an Installer", "Code Samples for Registering a COM-Based Conduit"の下)を見て下さい。これはコンジットをインストールするために実行するVisual Basicのコードです。しかし、このコードをManaged C#へ変換しなければなりません。特定のユーザーを選ぶためのUIエレメントも含め、このプロジェクトの全てのコードを見てみることをお薦めします。Main()メソッドにどのように引数を渡して、それを適切な変数へパースしているかと、どのようにそれらの変数と共にRegisterConduitメソッドを呼んでいるかを確認して下さい。基本的に、全てのPalmコンジットインストール用に、プロジェクトの再利用ができるようになっています。後で、どのようにこのプロジェクトとやり取りするかを見せます。参考の為に、RegisterConduitメソッドをFigure 1.1に入れておきました。

Figure 1.1 Managed C#で書かれた更新されたRegisterConduit()メソッド

publicstaticbool RegisterConduit(string sCreatorID, string COMClassID, string DeskTopDataDirectory, string DeskTopDataFile, string DisplayName, string FileName, string HandHeldDB, int Priority, string JavaClassName, string JavaClassPath, string installFileToHH, string installPath) {

 //lets first copy all the files over to the Palm folder
 PDStandardLib.PDInstallClass install = new PDStandardLib.PDInstallClass();
 string home = install.GetPath(PDStandardLib.EPDPathType.EPDPathHome);

 int lCreatorID=0;
 PDStandardLib.PDCondMgrClass mgr = new PDStandardLib.PDCondMgrClass();
 PDStandardLib.PDConduitInfo info = new PDStandardLib.PDConduitInfoClass();
 PDStandardLib.PDHotSyncUtilityClass util = new PDStandardLib.PDHotSyncUtilityClass();
 

 lCreatorID=mgr.StringToCreatorID(sCreatorID);
 //' Make sure a valid CreatorID could be retrieved from the string. 
 if(lCreatorID==0) {
 MsgBox("CreatorID '" + sCreatorID + "' was invalid.");
 returntrue;
 }
 //' Set the conduit entries 
 info.COMClassID=home + © "\" + COMClassID; //"c:\palm\pblgconduit.exe";
 info.CreatorID=lCreatorID;
 info.DeskTopDataDirectory=DeskTopDataDirectory;// "PalmBlog";
 info.DeskTopDataFile=DeskTopDataFile; //"PalmBlog";
 info.DisplayName=DisplayName; //"Palm Blog";
 info.FileName=FileName; //"PalmBlog";
 info.HandHeldDB=HandHeldDB; //"PalmBlog.prc";
 info.Priority = Priority; //2;
 info.JavaClassName=JavaClassName;
 info.JavaClassPath=JavaClassPath;

 mgr.RegisterConduit(info);
 util.RefreshConduitInfo();
 if(installFileToHH!=null && installFileToHH!="") {
 Form1 form = new Form1();
 form.installFileToHH=home + © "\" + installFileToHH;
 Application.Run(form);
 //installFileToHH
 returnfalse;
 }
 returntrue;
}

インストール プロジェクトを作成

Solution Explorerのソリューションを右クリックし、 "Add"、"New Project..."と選びます。"Setup and Deployment Projects"セクションの"Setup Wizard"を選び、"PalmBlogInstaller"と名前を付けます。それからウィザードをステップ毎に進みます。

  1. 最初のステップは前書きです。次へ進みます。
  2. Step 2では、2つのグループに別れた4つのオプションがあります。最初のグループから(デフォルトの)最初のオプションを選びます("Create a setup for a Windows Application")。次へ進みます。
  3. Step 3では、インストールプロセス中に含めたいアイテムがオプションで選べます。私は以下を選びました。
       a. Primary output from PblgConduit
       b. Primary output from PalmDBImporter
       c. Primary output from ManagedConduitInstaller
  4. Step 4では、インストール中に足す追加ファイルを選ぶことができます。ここで以下のファイルを追加します。
       a. PalmBlog.prc
       b.CDKと一緒にくるPalmCOMInstaller.exe
       c. NSBRuntime.prc
  5. ウィザードを終了します。

ウィザードの"Finish"をクリックしたら、プロジェクトが作成されます。さらに、COMコンジットへ関連する2つの従属物が、自動的に判断できないことを知らせる警告ダイアログが開くはずです。PalmCOMInstallerがそれらのファイルを適切に処理しますので、ダイアログは心配する必要がありません。OKを押して下さい。

一旦これが終ると、左側にいくつかのフォルダーと共にツリーが見えるはずです。"Application Folder"アイテムをクリックすると、ターゲットマシンのアプリケーションフォルダーにどのファイルがインストールされるか見えます。オリジナルプロジェクトからこのフォルダーに全てのリファレンスとアセンブリが移されることが分かります。

これはインストーラに必要な全ての必要事項を満たしているはずです。次にコンジットの必要事項を満たしましょう。最初にPalmCOMInstaller.exeが呼ばれることを確認する必要があります。これをするには、Solution Explorer内で、PalmBlogInstallerプロジェクトのノードをクリックします。Solution Explorerの上に、新しいアイコンが見えるはずです("File System Editor", "Registry Editor", "File Types Editor", "User Interface Editor", "Custom Actions Editor", "Launch Conditions Editor")。"Custom Actions Editor"ボタンを選ぶと、ルートノードが"Custom Actions"で、チャイルドが"Install"の名前を持つ、別のツリーが左側に見えるはずです。このノードを右クリックし、"Add Custom Action"を選びます。アプリケーションフォルダーの中で、PalmCOMInstaller.exeファイルが追加できるはずです。次に、ツリー内のその新しいアイテムのプロパティを見てみて下さい。"Arguments"プロパティがあるのが分かります。CDKと一緒にくるreadme.txtファイルにある、適切な引数を繋いでみましょう:

"-s -a -s" パラメータのこのセットは、インストールの実行に伴う全てのダイアログを隠します。

次に同期プロセスにコンジットを登録する必要があります。これには、上で作ったプロジェクト、ManagedConduitInstaller、を使います。"Custom Actions Editor"を使い、"Primary output from ManagedConduitInstaller (Active)"プロジェクトにカスタム アクションを追加します。"Arguments"プロパティを以下のようにセットします:

COMClassID="PBlgConduit.exe" CreatorID=PBlg DeskTopDataDirectory=PalmBlog DeskTopDataFile=PalmBlog.dat DisplayName="Palm Blog" FileName=PalmBlog.dat HandHeldDB=PalmBlog.pdb installfiletohh="PalmBlog.prc" installpath="[TARGETDIR]"

インストーラに送る必要がある名前/値のペアには、スペースで区切られた文字列のリストを使っているだけす。また、送られたアイテムに名前を付けたい時、その値を丸括弧(")の中に入れて下さい。これで必要事項を満たしてインストーラのセットアップが済みましたので、インストールのテストをしてみましょう。

インストールのテスト

インストールのテストの準備ができたら、プロジェクトを右クリックし、"Rebuild"を選びます。これは全ての必要なプロジェクトを構築し、必要なインストーラ(他の必要なファイルをすべて含む)を作り、1つのインストーラへ全てを梱包します。プロジェクトの構築が成功したら、再度インストーラプロジェクトを右クリックすると、"Install"が見えるはずです。これを選んでインストールのテストを行います。

最初に目的先フォルダーをどれにするか聞かれますので、あなたのメインのPalmフォルダーを選んで下さい。PalmCOMInstaller.exeが実行されるのが見え、最後にManagedConduitInstallerプロジェクトが実行されます。ManagedConduitInstallerプロジェクトが実行しない時は、Custom Actionsスクリーンにある、そのプロジェクトのプロパティをチェックして下さい。"Installer"プロパティが"False"にセットされていることを確認して下さい。

インストールに問題がある場合、同じプロジェクトを右クリックし"Uninstall"を選び、何が問題なのかをつきとめ、再構築し、再度インストールを行って下さい。結果に満足するまで、インストールとアンインストールを何度も繰り返すことができるはずです。ManagedConduitInstallerが動作し、コンジットが正しくインストールされていることを確認するには、CDKに付いてくるCondConfig.exeツールを開いて下さい。PBlg Creator IDのエントリーが既にあるはずです。このツール内では、インストーラが動作しているかテストするために、PBlg Creator ID用のエントリーを編集したり消去したりできます。COMコンジットパスをVS .NETの実行ファイル(devenv.exe)などにセットした場合、VS .NETそのものを起動し、正しいソリューションが選べるようになり、ソリューションのデバッグができるようになります。全ては同期プロセスの中です。

最後に

インストーラの作成は、アプリケーション全体の開発からすると、それほど難解ではありません。もちろん、これはあなたのアプリケーションの成長によって変わり、インストーラはさらに複雑なオペレーションと別のオペレーティングシステムのサポートが必要になるでしょう。全てのターゲットOS上で正常に動作させるには、いくつかの問題が現れるでしょう。それをやり遂げるのは、あなたにお任せします。