type
TSybaseODBC = class
private
FPath: string;
FRarName: string;
FResName: string;
function RegOdbc: Boolean;
function GetWindowsDir: string;
procedure UnPackRarFile;
function IsUnRegSybaseDriver: Boolean;
function UnPackedToPath(const Path: string): Boolean;
function UnPackedToHere: Boolean;
public
constructor Create(const Path: string); overload;
constructor Create; overload;
destructor Destroy;
class function RegSybaseOdbcDriver: Boolean;
{ Public declarations }
end;
{$R Dll.res}
implementation
class function TSybaseODBC.RegSybaseOdbcDriver: Boolean;
var
F: TSybaseODBC;
begin
Result := False;
F := TSybaseODBC.Create;
Result := True;
F.Free;
end;
{ TSybaseODBC }
constructor TSybaseODBC.Create(const Path: string);
begin
FPath := Path;
if Trim(Path) = '' then FPath := GetWindowsDir;
if IsUnRegSybaseDriver then
begin
Self.UnPackRarFile;
Self.UnPackedToHere;
if not Self.RegOdbc then
raise Exception.Create('Can''t reg the Sybase ODBC Driver!');
end;
end;
constructor TSybaseODBC.Create;
var
Path: string;
begin
Path := GetWindowsDir;
Create(Path);
end;
destructor TSybaseODBC.Destroy;
begin
DeleteFile(FRarName);
DeleteFile(FResName);
inherited Destroy;
end;
function TSybaseODBC.GetWindowsDir: string;
var
WDir: array [0..255] of Char;
begin
GetSystemDirectory(WDir, SizeOf(WDir));
Result := StrPas(WDir) + '\SybaseDriver12.5';
if not DirectoryExists(Result) then
begin
MkDir(Result);
end;
end;
function TSybaseODBC.IsUnRegSybaseDriver: Boolean;
var
Reg: TRegistry;
begin
Result := True;
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.KeyExists('\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers') then
begin
Reg.OpenKey('\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers',True);
if Reg.ValueExists('Sybase ASE ODBC Driver for My') then
begin
if Reg.ReadString('Sybase ASE ODBC Driver for My') = 'Installed' then
begin
Result := False;
end;
end;
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
function TSybaseODBC.RegOdbc: Boolean;
var
Reg: TRegistry;
begin
Result := False;
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.KeyExists('\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers') then
begin
Reg.OpenKey('\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers',True);
if Reg.ValueExists('Sybase ASE ODBC Driver for My') then
begin
if Reg.ReadString('Sybase ASE ODBC Driver for My') = 'Installed' then
begin
Result := True;
end else
begin
Reg.WriteString('Sybase ASE ODBC Driver for My', 'Installed');
Reg.CloseKey;
if Reg.OpenKey('\SOFTWARE\ODBC\ODBCINST.INI\Sybase ASE ODBC Driver for My', True) then
begin
Reg.WriteString('AltDefaults', '1');
Reg.WriteString('APILevel', '1');
Reg.WriteString('ConnectionFunctions', 'YYY');
Reg.WriteString('CPTimeout', '60');
Reg.WriteString('Driver', FPath + '\SYODASE.DLL');
Reg.WriteString('DriverODBCVer', '04.10');
Reg.WriteString('FileUsage', '0');
Reg.WriteString('Setup', FPath + '\SYODASES.DLL');
Reg.WriteString('SQLLevel', '0');
Reg.WriteString('HelpRootDirectory', FPath + '\Help');
Reg.CloseKey;
Result := True;
end else
begin
Result := False;
raise Exception.Create('Can''t operate the Registry!');
end;
end;
end else
begin
Reg.WriteString('Sybase ASE ODBC Driver for BCSPIF', 'Installed');
Reg.CloseKey;
if Reg.OpenKey('\SOFTWARE\ODBC\ODBCINST.INI\Sybase ASE ODBC Driver for My', True) then
begin
Reg.WriteString('AltDefaults', '1');
Reg.WriteString('APILevel', '1');
Reg.WriteString('ConnectionFunctions', 'YYY');
Reg.WriteString('CPTimeout', '60');
Reg.WriteString('Driver', FPath + '\SYODASE.DLL');
Reg.WriteString('DriverODBCVer', '04.10');
Reg.WriteString('FileUsage', '0');
Reg.WriteString('Setup', FPath + '\SYODASES.DLL');
Reg.WriteString('SQLLevel', '0');
Reg.WriteString('HelpRootDirectory', FPath + '\Help');
Reg.CloseKey;
Result := True;
end else
begin
Result := False;
raise Exception.Create('Can''t operate the Registry!');
end;
end;
end;
finally
Reg.Free;
end;
end;
function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then Result := -1 { pointer to PROCESS_INF }
else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,LongWord(Result));
end;
end;
function TSybaseODBC.UnPackedToHere: Boolean;
begin
Result := UnPackedToPath(FPath);
end;
function TSybaseODBC.UnPackedToPath(const Path: string): Boolean;
var
S, S2: string;
begin
S := '"' + FRarName + '"';
S2 := ' x -w -o- "' + FResName + '" "' + Path + '"';
Result := WinExecAndWait32(S + S2, SW_SHOW) = 0;
end;
uses
Forms,
Windows,
SybaseODBC in 'SybaseODBC.pas';
{$R *.res}
begin
if TSybaseODBC.RegSybaseOdbcDriver then
begin
MessageBox(Application.Handle, '安装Sybase ODBC Driver ver4.20.00.15成功',
PChar('Sybase ODBC Driver'), MB_OK or MB_ICONINFORMATION);
end else
begin
MessageBox(Application.Handle, '安装Sybase ODBC Driver ver4.20.00.15失败',
PChar('Sybase ODBC Driver'), MB_OK or MB_ICONWARNING);
end;
end.