Autor Beitrag
yogo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 29.10.10 12:11 
user profile iconyogo hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 5

Windows 7, Windows 8.1
Delphi XE
BeitragVerfasst: Fr 29.10.10 12:40 
user profile iconyogo hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: 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:
ausblenden 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);
  //Fenster nicht anzeigen
  StartupInfo.dwFlags := StartF_UseShowWindow;
  StartupInfo.wShowWindow := SW_Hide;
  if CreateProcess(nil, PChar(Befehl), nilnil, False, 0nil,
    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!!