InstallShield Tips

InstallShield を使ったTipsを紹介。 Visual C++ 6.0には、おまけとして InstallShield Visual C++ Edtionが付いてきます。
これを使えば、製品版のInstallShieldでなくてもかなりのことができます。
JPGファイルを表示してひとあじ違ったインストーラを作成しましょう。

JPGファイルを表示するには

InstallShieldでは、PlaceBitmap関数を使えば ビットマップファイル(BMP)を表示できますが、 JPGファイルの表示はできません。
=================== InstallShield プログラミングガイド 引用開始 =========
InstallShieldのサポートするグラフィック形式
InstallShieldを使用したセットアッププロセスでは、ビットマップ、ビルボード、
およびビデオファイルを表示できます。
InstallShieldは、以下のような画像形式をサポートしています。

●16色、256色、true color(24ビットの)ビットマップ
●16色と24色の透過ビットマップ
●Placeable Windowsメタファイル(.wmfファイル) 
●AVIファイル

InstallShieldを使用すると、セットアップ中、様々なタイミングで上のような形式の
画像を表示できます。また、各種の特殊効果を設定することも可能です。
=================== InstallShield プログラミングガイド 引用終了 =========
これでは、いちいちBMPファイルに変換してセットアップしなければならず不便です。 特にtrue color のBMPファイルは、ファイルサイズも大きくなってしまうので実用的ではありません。

ここでは、JPGファイルを表示する方法を紹介します。 インストールパッケージにはJPGファイルを組込み、表示する直前に JPGからBMPに変換して 表示することにします。

InstallShield での外部DLL呼出し

InstallShield のCallDLLFx 関数を使えば外部DLLを呼出せます。
=================== InstallShield のCallDLLFx 関数 引用開始 =========
構文
CallDLLFx (szDLL, szFunction, lvValue, svValue);

解説
CallDLLFx関数は、特定のDLLから関数を呼び出します。
この関数は、固定定義を使用する必要があり、この場合、
hwndがメインInstallShieldウィンドウのメインウィンドウハンドルになります。

LONG  APIENTRY  YourFunction (HWND hwnd, LPLONG lpIValue, LPSTR lpszValue);

パラメータ
szDLL
実行する関数を含むDLLの完全修飾ファイル名を指定します。

szFunction
szDLLで指定したDLLで呼び出す関数の名前を指定します。

IvValue
DLL関数に渡すLONG整数を指定します。

svValue
DLL関数に渡す文字列変数を指定します。

戻り値
CallDLLFx関数は、DLLの関数からLONG整数を返します。
=================== InstallShield のCallDLLFx 関数 引用終了 =========

JPG変換 DLL jpg2bmp.dll

DLLの呼出し方法がわかったところで、次はJPGファイルをBMPに変換する DLL が必要になります。
ここではInstallShield用に作成した jpg2bmp.dll のConvBmpIS2関数を使います。
ダウンロードは、こちら


ConvBmpIS2関数は、JPGファイルを BMPファイルに変換します。入力JPGファイルは、インデックス番号を 指定します。インデックス番号は、ディレクトリ内で名前順に並べたときの 0 から始まる数です。 出力BMPファイルは、入力ディレクトリ内にtarget.bmp という固定名で作成されます。 このConvBmpIS2関数は、InstallShieldのCallDLLFx関数で呼べる形式で作成してあります。
●int APIENTRY ConvBmpIS2(HWND hwnd,long* lpindex,LPSTR lpdir);

パラメータ:
hwnd
InstallShieldのWindowsハンドル。ConvBmpIS2関数では使用しません。

lpindex
JPGファイルを示すインデックス番号。0が先頭。ディレクトリ内で名前でソートした順番です。

lpdir
ディレクトリ名+ファイル拡張子。例: c:\temp\*.jpg

戻り値
1: BMPファイルは作成された。
0: エラーまたはインデックスオーバー。


InstallShieldでの使用例:
  szDLL = SUPPORTDIR ^ "jpg2bmp.dll";
  szPara = SUPPORTDIR ^ "*.jpg";
  nVal = nIndex;
  nResult = CallDLLFx(szDLL, "ConvBmpIS2", nVal, szPara); // 外部DLLのコール



●int APIENTRY ConvBmpIS(HWND hwnd,long* lpcolor,LPSTR lpname);

ConvBmpIS関数は、JPGファイル名を指定して変換したいときに使います。

パラメータ:
hwnd
InstallShieldのWindowsハンドル。ConvBmpIS関数では使用しません。

lpcolor
カラー数を指定。0を指定するとそのまま。減色したいときに0以外を指定します。

lpname
JPGファイル名。例: c:\temp\abc.jpg

戻り値
1: BMPファイルは作成された。出力ファイル名は、入力ファイル名の後ろに ".bmp" を付けた名前で作成されます。
0: エラー。


InstallShieldでの使用例:
  szDLL = SUPPORTDIR ^ "jpg2bmp.dll";
  szPara = SUPPORTDIR ^ "abc.jpg";
  nVal = 0;
  nResult = CallDLLFx(szDLL, "ConvBmpIS", nVal, szPara); // 外部DLLのコール
  PlaceBitmap(szPara + ".bmp",0,0,0,UPPER_LEFT); // イメージの表示


セットアップファイルのコピー

次にInstallShieldの[セットアップファイル]の[言語非依存]-[オペレーティングシステム言語非依存]に jpg2bmp.dll と表示したいJPGファイルをコピーします。
表示する順番は、名前順にしたほうが スクリプトが単純になるので、JPGファイルをリネームしてコピーします。
コピーしたファイルは、スクリプトの中でSUPPORTDIR変数でアクセスできます。 InstallShieldは、セットアップ初期化中、一時ファイルおよび _sys1.cabや _user1.cabに 圧縮されたファイルをコピーできるターゲットシステム上のフォルダを設定します。 InstallShieldでは、そのフォルダへのフルパスをSUPPORTDIRに割り当てます。 インストール終了後には、これらのファイルはすべてInstallShieldが削除します。

スクリプトの作成

●InstallShieldのスクリプトで次のような ShowImage関数を作成します。

function ShowImage(nIndex)
   STRING szDLL,szPara;
   NUMBER nResult,nVal;
begin
  // DLLの場所を設定
  szDLL = SUPPORTDIR ^ "jpg2bmp.dll";  // DLLのフルパス
  szPara = SUPPORTDIR ^ "*.jpg";       // 表示したいファイルの指定
  nVal = nIndex;
  nResult = CallDLLFx(szDLL, "ConvBmpIS2", nVal, szPara); // 外部DLLのコール
  if (nResult > 0 ) then
      //SetDisplayEffect(EFF_BOXSTRIPE);  // 表示効果 製品版のみ
      PlaceBitmap(SUPPORTDIR ^ "target.bmp",nIndex,0,0,UPPER_LEFT); // イメージの表示
      if (nIndex > 0) then
          PlaceBitmap("",nIndex-1,0,0,REMOVE);  // 前のイメージを消去
      endif;
      //SetDisplayEffect(EFF_NONE);    // 製品版のみ
      Delay(3);   // 表示時間の設定  表示時間を変更するときはここを修正します。
  endif;
  return nResult;
end;


●プロトタイプ宣言とグローバル変数を定義します。


//プロトタイプ宣言:
    prototype ShowImage(NUMBER);   // show jpg image function
//グローバル変数
    NUMBER      nBMP;


●スライドショーを開始するにはShowImage関数を次のように呼出します。

    nBMP = 0;	// slide show index
    while (ShowImage(nBMP) > 0)     // JPGファイルを名前順に表示
            nBMP = nBMP + 1;
    endwhile;



babaqフリーソフトのご使用上の注意

●プログラムを使って発生した損害に関しては、一切の責任を負いません。
●使用、配布に制限はありません。自由にお使いください。
●動作の保証はありません。
●動作を確認したOSは、Windows NT 4.0 とWindows 95/98のみです。

Home


Copyright 1999 Tatsuo Baba,All rights reserved.