检查psqlodbc是否已从系统中取消挂起

时间:2011-11-23 07:34:44

标签: delphi postgresql odbc

我正在处理需要psqlodbc驱动程序和postgresSQl 9.0数据库的软件, 我们有一个使用delphi 7设计的安装程序,可以安静地安装psqlodbc和postgreSQl 9 点击一个按钮一个接一个,这里一切都运行正常, 但问题出在卸载期间 我首先想要解压缩psqlodbc,然后在sinlge按钮上单击postgreSQl 9,

我想在psqlodbc卸载后才使用shellpApi运行postgreSQl 9 unistaller, 截至目前我正在检查' cmd.exe'正在运行或不运行postgreSQl卸载程序,但有时在卸载psqlodbc之后“cmd.exe”#39;保留在postgreSQl unistaller无法执行,

所以请告诉我 如何检查psqlodbc卸载过程是否完全。

文件是 1.psqlodbc.msi 2.postgresql-9.0.2-1-windows.exe后

使用bat文件处理安装/卸载

感谢先进:)

2 个答案:

答案 0 :(得分:1)

如果驱动程序可用,您可以检查注册表。安装完成后,您将获得:

c:\tmp\pg>reg query "hklm\SOFTWARE\ODBC\ODBCINST.INI\PostgreSQL ANSI"

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\PostgreSQL ANSI
    APILevel    REG_SZ  1
    ConnectFunctions    REG_SZ  YYN
    Driver      REG_SZ  C:\Program Files\psqlODBC\0900\bin\psqlodbc30a.dll
    DriverODBCVer       REG_SZ  03.00
    FileUsage   REG_SZ  0
    Setup       REG_SZ  C:\Program Files\psqlODBC\0900\bin\psqlodbc30a.dll
    SQLLevel    REG_SZ  1
    UsageCount  REG_DWORD       0x1

当您取消它时,您将获得(本地化版本):

c:\tmp\pg>reg query "hklm\SOFTWARE\ODBC\ODBCINST.INI\PostgreSQL ANSI"

Błąd: system nie może odnaleźć określonego klucza rejestru lub wartości.

c:\tmp\pg>

(此menas:错误:系统无法在注册表中找到键或值)

请参阅:reg /?了解如何使用它以及您可以批量使用的返回代码。

您还可以在HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall

下搜索注册表卸载信息

答案 1 :(得分:0)

我得到了如何检查psqlodbc是否已完全卸载,以便我可以开始取消postgres

为此,我找到了解决方案 On stackoverflow itself

function TForm1.ExecAndWait(const CommandLine: string) : Boolean;
var
 StartupInfo: Windows.TStartupInfo;        // start-up info passed to process
 ProcessInfo: Windows.TProcessInformation; // info about the process
 ProcessExitCode: Windows.DWord;           // process's exit code
  begin 
    // Set default error result
    Result := False;
  // Initialise startup info structure to 0, and record length
   FillChar(StartupInfo, SizeOf(StartupInfo), 0);
   StartupInfo.cb := SizeOf(StartupInfo);
 // Execute application commandline
   if Windows.CreateProcess(nil, PChar(CommandLine),
   nil, nil, False, 0, nil, nil,
   StartupInfo, ProcessInfo) then
 begin
   try
    // Now wait for application to complete
     if Windows.WaitForSingleObject(ProcessInfo.hProcess, INFINITE)
      = WAIT_OBJECT_0 then
      // It's completed - get its exit code
      if Windows.GetExitCodeProcess(ProcessInfo.hProcess,
       ProcessExitCode) then
       // Check exit code is zero => successful completion
      if ProcessExitCode = 0 then
         Result := True;
   finally
  // Tidy up
   Windows.CloseHandle(ProcessInfo.hProcess);
   Windows.CloseHandle(ProcessInfo.hThread);
  end;
  end;
 end;

所以第1步     if ExecAndWait('msiexec /x C:\psqlodbc09\psqlodbc.msi') then begin //uninstall postgresNow...!! end;