AW: Externes Programm starten
Ich kaufe ein Komma für's Format() in ExecAndWait().
|
AW: Externes Programm starten
Das Problem ist, dass der zweite Parameter an CreateProcess variabel sein muss. Das ist er hier durch den simplen Cast
Delphi-Quellcode:
nicht.
PChar(CommandLine)
Man muss vorher UniqueString oder eine lokale Variable benutzen oder auch
Delphi-Quellcode:
sollte reichen. Das bewirkt, dass ein neuer String erzeugt wird, der auch beschreibbar ist.
PChar(CommandLine + '')
Siehe Doku: https://msdn.microsoft.com/en-us/lib...or=-2147217396 Der Parameter ist als in und out markiert. |
AW: Externes Programm starten
|
AW: Externes Programm starten
Hallo Leute,
ich habe es überprüft, es ist richtig. Programname = "MSPaint.exe" mit Pfad (C:\Windows\System32\mspaint.exe) und Bilddateiname ohne Pfad bilden die Komandozeile und der Pfad der Bilddatei den Parameter. Wie ich schonmal geschrieben habe, läuft es unter Vista prima, also kann es doch nicht am meinen "Programmierkünsten" liegen. MSPaint liegt im Ordner System32, ist also 32-Bit Programm?!. Hat sich der Aufruf von MSPaint mit Parameter geändert? Jaenicke und DeddyH, wollt ihr sagen, dass sich hier zwischen Vista und Windows 10 hier etwas geändert hat? Das werde ich mir vornehmen und dann wieder melden. Ich habe es so geändert: function TMainForm.ExecAndWait(const CommandLine, Parameter: string) : Boolean; var PParameter: PChar; 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 PParameter:=PChar(Parameter); Result := False; // Initialise startup info structure to 0, and record length FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow:=SW_HIDE; // Execute application commandline if Windows.CreateProcess(nil, PChar(CommandLine), nil, nil, False, 0, nil, PParameter, 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 else Showmessage(Format('Fehler:%d - %s!',[GetLastError,SysErrorMessage(GetLastError)])) end; {TMainForm.ExecAndWait} Es hilft nicht. Willie. |
AW: Externes Programm starten
Wenn es richtig ist, klappt ja auch alles. Ach, klappt nicht? Dann kann es auch nicht richtig sein. Setz doch einfach mal ein paar der (guten) Vorschläge in diesem Thread um.
|
AW: Externes Programm starten
Zitat:
Das Problem gab es auch schon bei Vista mit einem 64-Bit Programm. Und vermutlich auch bei XP, aber das haben nicht so viele als 64-Bit benutzt. |
AW: Externes Programm starten
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DeddyH, hab' ich gemacht. Es funktioniert nicht.
Anbei ExecAndWait, herausextrahiert aus dem Projekt. Willie. |
AW: Externes Programm starten
Wenn ich
Delphi-Quellcode:
benutze, gibt es keinen Fehler mehr. Den hattest du bei dir gar nicht, das ist mir gerade aufgefallen, weil du Delphi 2005 hast. Der tritt nur bei Unicode auf.
PChar(CommandLine + '')
Jedenfalls ist das Problem schlicht, dass mspaint gar nicht sichtbar gestartet wird. Deshalb wartet dein Programm nach dem CreateProcess logischerweise unendlich, denn genau das soll der Befehl ja auch machen. Du kannst den neuen Prozess ja auch nicht sehen und beendest ihn daher nicht. Wenn du das gleich am Anfang gesagt hättest, wäre es einfacher gewesen. ;-) Jedenfalls ist die Ursache sehr einfach. Du gibst ja den expliziten Befehl, dass Paint versteckt gestartet werden soll:
Delphi-Quellcode:
Probiere es mal mit SW_SHOWNORMAL.
StartupInfo.wShowWindow:=SW_HIDE;
//SW_HIDE, also versteckt starten |
AW: Externes Programm starten
Hallo Jaenicke,
Das ist die Lösung SW_SHOWNORMAL !!! Jetzt öffnet sich MSPaint. Klasse. Ist klar ExifTools ist ein Konsolenprogramm, deshalb hat es im Hintergrund seine Arbeit getan. Es bleibt nur die Frage, warum bei Vista immer MSPaint aufging auch mit SW_HIDE? Schönen Abend und euch Allen Dank für eure Geduld Willie. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz