构件下载:
http://www.algonet.se/~flysjo/interbase/files/ibwise.zip
以下是一个例子演示如何在Wise中嵌入Interbase的安装,安装Interbase时使用到了IBINSTALL.DLL。
工作原理
---------------------------------
WISE InstallBuilder以及WISE Solutions公司出品的其它安装制作工具,可以在安装的过程中调用DLL文件。
下面是一个调用IBWISE.DLL的例子,这个DLL是用Delphi写的(代码在后面),它读取WISE变量并将它们传送给IBINSTALL.DLL(由Interbase提供)。
IBINSTALL.DLL来完成实际的Interbase的安装,而IBWISE.DLL则对安装过程进行封装,包括选项设置、错误处理和进度显示。
IBWISE.DLL同样也将所有从IBINSTALL.DLL返回的状态消息传送给WISE。
想得到更多关于WISE或Borland Interbase的信息,可以查看本文最后的“更多信息”部分。
在WISE脚本中需要做的事情
------------------------------------------
IBWISE.DLL需要WISE的变量,确保它们在IBWISE.DLL调用前已被WISE设置为正确值。
在这些变量中,字符串变量IBINSTALLMODE(将被IBWISE.DLL读取并用于控制Interbase安装)可以设置为R和/或者S。
R = 安装后启动(运行)Interbase服务器
S = 安静安装方式(将不会有进度窗口)
例如: 将变量 IBINSTALLMODE 设置为 RS
(以安静方式安装Interbase,并在安装完成后启动Interbase服务器)
IBOPTIONS (可选) 字符串类型, 设置此变量以控制Interbase的哪些部分需要安装
[空] = 全部Interbase文件
A = IB_SERVER
B = IB_CLIENT
C = IB_CMD_TOOLS
D = IB_CMD_TOOLS_DB_MGMT
E = IB_CMD_TOOLS_USR_MGMT
F = IB_CMD_TOOLS_DB_QUERY
G = IB_GUI_TOOLS
H = IB_DOC
I = IB_EXAMPLES
J = IB_EXAMPLE_API
K = IB_EXAMPLE_DB
L = IB_DEV
M = IB_REPLICATION
N = IB_REPL_MANAGER
O = IB_REPL_SERVER
P = IB_CONNECTIVITY
Q = IB_ODBC_CLIENT
R = IB_JDBC
S = IB_JDBC_CLIENT
T = IB_JDBC_SERVER
例如: 将变量 IBOPTIONS 设置为 AB
(安装Interbase服务器和客户端文件)
IBSRCDIR 字符串,Interbase源文件路径,通常是一个临时目录,WISE在安装过程中将文件解压到这个目录中。
IBDESTDIR (可选项) 字符串,Interbase安装的目的路径,如果为空,则 Interbase将会安装到缺省目录中。
输出变量 (由IBWISE.DLL使用并将结果返回给WISE )
IBUIFILE 字符串,IBUNINST.EXE需要使用的卸载文件。
IBSTATUS 字符串,如果安装不成功,则包含错误信息;如果安装过程没有错误发生,则包含"Success"。
以下示例演示如果设置这些变量,解压Interbase源文件并安装。
将以下编码复制到你的WISE脚本中。
(不要忘记修改Interbase文件的源路径)
item: Open/Close INSTALL.LOG
Flags=00000001
end
item: Create Directory
Pathname=%TEMP%\INTERBASE\
end
item: Install File
Source=C:\install\InterBaseServer\*.*
Destination=%TEMP%\INTERBASE\
Flags=0000000110100010
end
item: Install File
Source=C:\install\IBWISE\Ibwise.dll
Destination=%TEMP%\INTERBASE\Ibwise.dll
Flags=0000000010100010
end
item: Open/Close INSTALL.LOG
end
item: Set Variable
Variable=IBINSTALLMODE
Value=R
end
item: Set Variable
Variable=IBOPTIONS
Value=A
end
item: Set Variable
Variable=IBSRCDIR
Value=%TEMP%\INTERBASE\
end
item: Call DLL Function
Pathname=%TEMP%\INTERBASE\IBWISE.DLL
Function Name=InstallInterbase
Variables Added=IBUIFILE,IBSTATUS
Return Variable=0
Flags=00000100
end
item: Open/Close INSTALL.LOG
Flags=00000001
end
item: Delete File
Pathname=%TEMP%\INTERBASE
Flags=00000100
end
item: Open/Close INSTALL.LOG
end
--------------------------------------------------------------------------------
IBWISE.DLL的源代码(Delphi)
以下编码是Borland Delphi编写,编译生成IBWISE.DLL。
这里是全部源程序
IBWISE.DPR
library IBWISE;
uses
SysUtils,
Classes,
IBWiseUnit in 'IBWiseUnit.pas',
StatusFormUnit in 'StatusFormUnit.pas' {StatusForm};
exports
InstallInterbase,
GetIBInstallDir;
{$R *.RES}
begin
end.
IBWiseUnit.pas
unit IBWiseUnit;
//——————————————————————————————————————————————————
// WISE InstallIBServer version 1.1 by Magnus Flysj?
// flysjo@algonet.se
// Copyright 2001, Magnus Flysj?
//——————————————————————————————————————————————————
interface
uses WinTypes, WinProcs, SysUtils, WinSvc;
//—[Wise]——————————————————————————————————————————————
Type
ParamRec = record
wStructLen: DWORD; { The length of the structure }
hMainWnd: HWND; { Handle to main window }
wMaxReplaces: DWORD; { Maximum number of replaces }
wRepNameWidth: DWORD; { The width of a replace name }
wRepStrWidth: DWORD; { The width of each replace string }
wCurrReps: DWORD; { Current number of replace strings }
szRepName: PChar; { The actual replace names }
szRepStr: PChar; { The actual replace values }
wRunMode: DWORD; { The installation mode }
fLogFile: DWORD; { A file handle to the log file }
szParam: PChar; { String parameter from Wise Installation System }
end;
//—[Interbase]—————————————————————————————————————
OPTIONS_HANDLE = Integer;
POPTIONS_HANDLE = ^OPTIONS_HANDLE;
MSG_NO = Longint;
OPT = Longint;
TEXT = PChar;
FP_ERROR = function(msg: MSG_NO; data: Pointer; error_msg: TEXT): Integer; stdcall;
FP_STATUS = function(status: integer; data: Pointer; const status_msg: TEXT): Integer; stdcall;
TIsc_install_clear_options = function (pHandle: POPTIONS_HANDLE):MSG_NO; stdcall;
TIsc_install_execute = function (Handle: OPTIONS_HANDLE; src_dir, dest_dir: TEXT;status_func:FP_STATUS;
status_data: Pointer;error_func: FP_ERROR; error_data: Pointer;uninstal_file_name: TEXT):MSG_NO; stdcall;
TIsc_install_get_info = function (info_type :integer; option :OPT; info_buffer : Pointer;buf_len : Cardinal):
MSG_NO; stdcall;
TIsc_install_get_message = function (Handle: OPTIONS_HANDLE; message_no: MSG_NO;message_txt: Pointer;
message_len: Cardinal):MSG_NO; stdcall;
TIsc_install_load_external_text = function (msg_file_name: TEXT):MSG_NO; stdcall;
TIsc_install_precheck = function (Handle: OPTIONS_HANDLE; src_dir, dest_dir: TEXT): MSG_NO; stdcall;
TIsc_install_set_option = function (pHandle: POPTIONS_HANDLE; option: OPT): MSG_NO; stdcall;
TIsc_uninstall_execute = function (uninstall_file_name: TEXT; status_func: FP_STATUS;status_data: pointer;
error_func: FP_ERROR; error_data: pointer): MSG_NO; stdcall;
TIsc_uninstall_precheck = function (uninstall_file_name: TEXT):MSG_NO; stdcall;
TIsc_install_unset_option = function (pHandle: POPTIONS_HANDLE; option: OPT):MSG_NO; stdcall;
const
IB_INSTALL_DLL = 'ibinstall.dll';
{ These are the values the FP_ERROR routine can return. }
isc_install_fp_retry = -1;
isc_install_fp_continue = 0;
isc_install_fp_abort = 1;
{ isc_install_get_info info_types }
isc_install_info_destination = 1;
isc_install_info_opspace = 2;
isc_install_info_opname = 3;
isc_install_info_opdescription = 4;
ISC_INSTALL_MAX_MESSAGE_LEN = 300;
ISC_INSTALL_MAX_MESSAGES = 200;
ISC_INSTALL_MAX_PATH = MAX_PATH;
{ Basic Components used to install InterBase }
INTERBASE = 1000;
IB_SERVER = 1001;
IB_CLIENT = 1002;
IB_CMD_TOOLS = 1003;
IB_CMD_TOOLS_DB_MGMT = 1004;
IB_CMD_TOOLS_USR_MGMT = 1005;
IB_CMD_TOOLS_DB_QUERY = 1006;
IB_GUI_TOOLS = 1007;
IB_DOC = 1011;
IB_EXAMPLES = 1012;
IB_EXAMPLE_API = 1013;
IB_EXAMPLE_DB = 1014;
IB_DEV = 1015;
IB_REPLICATION = 1016;
IB_REPL_MANAGER = 1017;
IB_REPL_SERVER = 1018;
IB_CONNECTIVITY = 1101;
IB_ODBC_CLIENT = 1102;
IB_JDBC = 1110;
IB_JDBC_CLIENT = 1103;
IB_JDBC_SERVER = 1105;
{ Error and warning codes }
isc_install_optlist_empty = -1;
isc_install_actlist_empty = -2;
isc_install_fp_copy_delayed = -3;
isc_install_fp_delete_delayed = -4;
isc_install_option_not_found = -5;
isc_install_msg_version = -6;
isc_install_cant_load_msg = -7;
isc_install_invalid_msg = -8;
isc_install_invalid_tbl = -9;
isc_install_cant_create_msg = -10;
isc_install_handle_not_allocated = -11;
isc_install_odbc_comp_notfound = -12;
isc_install_cant_delete = -13;
isc_install_cant_rmdir = -14;
isc_install_key_nonempty = -15;
isc_install_success = 0;
{ File and directory related errors }
isc_install_path_not_valid = 1;
isc_install_path_not_exists = 2;
isc_install_cant_write = 3;
isc_install_type_unknown = 4;
isc_install_cant_move_file = 5;
isc_install_device_not_valid = 6;
isc_install_data_truncated = 7;
isc_install_cant_get_temp = 8;
isc_install_no_file = 9;
isc_install_cant_load_lib = 10;
isc_install_cant_lookup_lib = 11;
isc_install_file_exists = 12;
isc_install_cant_open_log = 13;
isc_install_write_error = 14;
isc_install_read_error = 15;
isc_install_invalid_log = 16;
isc_install_cant_read = 17;
isc_install_no_diskspace = 18;
isc_install_cant_create_dir = 19;
isc_install_msg_syntax = 20;
isc_install_fp_delete_error = 21;
isc_install_fp_rename_error = 22;
isc_install_fp_copy_error = 23;
{ Precheck related errors }
isc_install_system_not_supported = 24;
isc_install_server_running = 25;
isc_install_classic_found = 26;
isc_install_no_privileges = 27;
isc_install_cant_get_free_space = 28;
isc_install_guardian_running = 29;
isc_install_invalid_option = 30;
isc_install_invalid_handle = 31;
isc_install_message_not_found = 32;
{ TCP/IP services related }
isc_install_no_stack = 33;
isc_install_cant_add_service = 34;
isc_install_invalid_port = 35;
isc_install_invalid_service = 36;
isc_install_no_proto = 37;
isc_install_no_services_entry = 38;
isc_install_sock_error = 39;
isc_install_conversion_error = 40;
{ Operations errors }
isc_install_cant_copy = 41;
isc_install_no_mem = 42;
isc_install_queue_failed = 43;
isc_install_invalid_param = 44;
isc_install_fp_error_exception = 45;
isc_install_fp_status_exception = 46;
isc_install_user_aborted = 47;
{ Registry related errors }
isc_install_key_exists = 48;
isc_install_cant_create_key = 49;
isc_install_cant_set_value = 50;
isc_install_cant_open_key = 51;
isc_install_cant_delete_key = 52;
isc_install_cant_query_key = 53;
isc_install_cant_delete_value = 54;
{ OS services related errors }
isc_install_service_existed = 55;
isc_install_cant_create_service = 56;
isc_install_cant_open_service = 57;
isc_install_cant_query_service = 58;
isc_install_service_running = 59;
isc_install_cant_delete_service = 60;
isc_install_cant_open_manager = 61;
isc_install_system_error = 62;
isc_install_com_regfail = 63;
isc_install_dcom_required = 64;
{ ODBC installation errors }
isc_install_odbc_general = 65;
isc_install_core_version = 66;
isc_install_drv_version = 67;
isc_install_tran_version = 68;
//———————————————————————————————————————————————————————
type
TIBWiseInstall = class;
TIBInstallOption = ( opINTERBASE, opIB_SERVER, opIB_CLIENT, opIB_CMD_TOOLS,
opIB_CMD_TOOLS_DB_MGMT, opIB_CMD_TOOLS_USR_MGMT,
opIB_CMD_TOOLS_DB_QUERY, opIB_GUI_TOOLS, opIB_DOC,
opIB_EXAMPLES, opIB_EXAMPLE_API, opIB_EXAMPLE_DB,
opIB_DEV, opIB_REPLICATION, opIB_REPL_MANAGER,
opIB_REPL_SERVER, opIB_CONNECTIVITY, opIB_ODBC_CLIENT,
opIB_JDBC, opIB_JDBC_CLIENT, opIB_JDBC_SERVER );
TIBInstallOptions = set of TIBInstallOption;
TIBInstallError = function(Handle : HWND; Caller : TIBWiseInstall; Msg: Longint;Error_msg: string; var Handled : boolean) : integer;
TIBInstallStatus = procedure(Handle : HWND; Caller : TIBWiseInstall;Status : integer; const Status_msg : string);
TIBWiseInstall = class(TObject)
constructor Create;
destructor Destroy; override;
private
FDLLInst : HInst;
Isc_install_clear_options : TIsc_install_clear_options;
Isc_install_execute : TIsc_install_execute;
Isc_install_get_info : TIsc_install_get_info;
Isc_install_get_message : TIsc_install_get_message;
Isc_install_load_external_text : TIsc_install_load_external_text;
Isc_install_precheck : TIsc_install_precheck;
Isc_install_set_option : TIsc_install_set_option;
Isc_uninstall_execute : TIsc_uninstall_execute;
Isc_uninstall_precheck : TIsc_uninstall_precheck;
Isc_install_unset_option : TIsc_install_unset_option;
FDestDirectory : string;
FSourceDirectory : string;
FIBHandle : POPTIONS_HANDLE;
FHWND : HWND;
FIBInstallOptions : TIBInstallOptions;
FIBInstallError : TIBInstallError;
FIBInstallStatus : TIBInstallStatus;
FLastError : MSG_NO;
FStartAfterInstall : boolean;
FUninstallFile : string;
FSilent : boolean;
procedure SetOptions;