Autor |
Beitrag |
yogo
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: Fr 29.10.10 12:00
Hallo,
ich versuche herauszufinden, ob ein bestimmtes programm installiert, bzw. in der konsole ausführbar ist.
(In meinem Fall: SQLCMD)
Momentan schaue ich in der Registry, aber da es verschiedene Versionen gibt, ist das Ergebnis nicht zuverlässig.
(HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup
gibt statt 90 auch 80 oder MS.SQL1(gilt auch für die Verzeichnisstruktur in Microsoft SQL Server))
Als direkter Test vor der tatsächlichen Ausführung führe ich mithilfe von shellexecute "SQLCMD -?" aus und überprüfe dann, ob der exitcode -1 ist(idiotischerweise ist er 0 wenn das programm nicht gefunden wurde).
Dabei tritt allerdings eine Fehlermeldung auf, wenn das Programm nicht existiert, die ich gerne vermeiden will("sqlcmd" konnte nicht gefunden werden. ...).
Hat jemand von euch eine Idee, wie ich herausfinde, ob sqlcmd vorhanden ist?
TIA, yogo1212
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Fr 29.10.10 12:11
yogo hat folgendes geschrieben : | Hat jemand von euch eine Idee, wie ich herausfinde, ob sqlcmd vorhanden ist? |
Ich habe das Programm leider nicht und kann es nicht testen. Aber schau einmal, ob es einen Eintrag unter
HKey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\App Paths\
gibt. Falls ja, könntest Du meine Funktion aus dem Forumsbeitrag www.delphi-forum.de/...=0&postorder=asc verwenden.
|
|
yogo 
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: Fr 29.10.10 12:33
leider hat sqlcmd dort keinen eintrag....
es müsste doch irgendwie möglich sein, dieses fenster zu verstecken(SW_HIDE hilft leider nicht gegen die fehlermeldung)..
ich habe grade in die path-variable geschaut, dort steht der pfad zu der sqlcmd.exe drinne.
hat vlt noch jemand eine idee, als mit fileexists alle path-teile nach sqlcmd.exe durchsuchen?
|
|
FaTaLGuiLLoTiNe
      
Beiträge: 200
Erhaltene Danke: 5
Windows 7, Windows 8.1
Delphi XE
|
Verfasst: Fr 29.10.10 12:40
yogo hat folgendes geschrieben : |
ich habe grade in die path-variable geschaut, dort steht der pfad zu der sqlcmd.exe drinne.
hat vlt noch jemand eine idee, als mit fileexists alle path-teile nach sqlcmd.exe durchsuchen? |
Das mit der Umgebungsvariablen wollte ich auch gerade vorschlagen.
Wieso willst du alle PATH-Teile per FileExists überprüfen?
Es würde doch reichen, per Pos nach dem String sqlcmd.exe zu suchen, so den Pfad zu ermitteln und dann einmal per FileExists zu überprüfen, ob die Datei an der Stelle zu finden ist, oder?
_________________ << FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Fr 29.10.10 12:52
Wenn SW_Hide nicht hilft, dann würde ich CreateProcess statt ShellExecute verwenden. Man kann Ausgaben auch in Dateien umleiten usw. Beispiel siehe hier (Beitrag: "Wie kann man aus einem Delphi-Programm eine Diskette formatieren?"): www.delphi-fundgrube.de/faq03.htm
Edit1: Ich sehe gerade, daß das ein etwas älterer Beitrag von mir ist. Also statt "command.com" bitte "cmd" verwenden.
|
|
yogo 
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: Fr 29.10.10 13:52
@FaTaLGuiLLoTiNe:
Leider steht in der Path variable nur "C:\Programme\Microsoft SQL Server\90\Tools\binn", allerdings kann es passieren, dass SQLCMD und SQLNCLI in ein komplett anderes Verzeichnis installiert werden(auf server-os zb). Ich wüsste nicht, wie ich zuverlässig das richtige Verzeichnis probiere. Hoffentlich muss ich nicht tatsächlich am Ende alle probieren.
@Gerd Kayser:
Vielen, vielen Dank!! Es geht auch ohne "cmd /c"(dabei müsste ich mir sowieso noch was mit der Exitcode überlegen)
Ich hab jetzt die folgende Funktion daraus gebastelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function CreateProcessCstm(befehl: string): Longint; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb := SizeOf(TStartupInfo); StartupInfo.dwFlags := StartF_UseShowWindow; StartupInfo.wShowWindow := SW_Hide; if CreateProcess(nil, PChar(Befehl), nil, nil, False, 0, nil, PChar(ExtractFilePath(ParamStr(0))), StartupInfo, ProcessInfo) then begin WaitForSingleObject(ProcessInfo.hProcess, Infinite); GetExitCodeProcess(ProcessInfo.hProcess, DWORD(Result)); CloseHandle(ProcessInfo.hProcess); end else Result := -1; end; |
EDIT: -2.. macht wenig sinn-> else Result := -1;
Vielen Dank!!
|
|
|