C++ で作成した DLL の関数を InstallShield インストーラーから呼び出す

まず、Visual C++ で下記のようなコードを DLL としてビルドします。サンプルとして呼び出す関数名は Test 関数として、引数のウィンドウハンドルに対してメッセージボックスを表示するだけの関数です。

#include <windows.h>

#if _MSC_VER > 1200 // Later than Visual Studio 6.0
#define EXPORT comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
#else // Cannot use this way of exporting functions.
#define EXPORT
#endif // else need to use DEF file or __declspec(dllexport)

int __stdcall Test(HWND hWnd)
{
#pragma EXPORT
	MessageBox(hWnd, TEXT("Test"), TEXT("Title"), 0);
	return 0;
}

出来上がった DLL を Dependency Walker で見ると、以下のようになっています。ここで、Test 関数名にアットマーク (‘@’) や下線 (‘_’) などの名前修飾がないことを確認します。名前修飾があると InstallShield 側から関数を呼び出すことが出来ません。

次に InstallShield 側でスクリプトの先頭で関数定義を下記のように行います。この関数定義は、DLL のファイル名の後ろにドット(‘.’)を付けその後ろに関数の定義を書きます。関数の定義は C++ で定義した関数の引数の型、戻り値の型がそれぞれ合っている必要があります。

prototype INT MyDLL.Test(HWND);

関数を呼び出すには下記のようにすます。

function MyFunc()
	HWND hWindowHandle;
begin
	hWindowHandle = GetWindowHandle(HWND_INSTALL);
	Test(hWindowHandle);
	return 0;
end;

上記のコードでビルドすると DLL は setup.exe と同じフォルダに配置すると実行時に自動的に読み込まれるようですが DLL がない場合は実行時にエラーとなります。Setup.exe の中に埋め込んで明示的に読み込むには、DLL を Support Files に挿入し下記のようなコードで呼び出すようにします。(ここでは組み込む DLL のファイル名は “MyDLL.dll” とします)

function MyFunc()
	HWND hWindowHandle;
begin
	UseDLL(SUPPORTDIR ^ "MyDLL.dll");
	hWindowHandle = GetWindowHandle(HWND_INSTALL);
	Test(hWindowHandle);
	UnUseDLL(SUPPORTDIR ^ "MyDLL.dll");
	return 0;
end;

参考サイト:
http://helpnet.installshield.com/installshield21helplib/helplibrary/IHelpIScriptCallingDLLFunction.htm
https://msdn.microsoft.com/ja-jp/library/office/bb687850.aspx


スポンサーリンク
広告1
広告1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
広告1