![]() |
Delphi-Version: 10.2 Tokyo
Shellexecute richtig anwenden/übersetzen
Hi zusammen
In einem in Javascript geschriebenen Beispielcode wird Shellexecute aufgerufen: Ich hab im Editor 2 Zeilen, von denen die erste die Javascript-Schnipel wiedergibt und die 2. diie entsprechende Schreibweise in ObjectPascal definieren sollte.
Delphi-Quellcode:
Die ersten 2 Parameter sind String, bzw. PChar. Der 3. Parameter besteht ausdem Bezeichner PDFCreator, gefolgt von einem Backslash. Das ist insofern Korrekt, als Shellexecute an dieser Stelle tatsächlich keinen String erwartet.
ShellExecute("RUNDLL32.exe", "PRINTUI.DLL,PrintUIEntry /k /n \"PDFCreator\"", "", "open", 1);
ShellExecute('RUNDLL32.exe', 'PRINTUI.DLL,PrintUIEntry /k /n \'PDFCreator\'', '', 'open', 1); Ich hab eigentlich nicht erwartet, dass das gleich funktioniert, insbesondere, da an shellexecute PChars übergeben werden müssen. Dass aber ein Kompilierungsversuch fehlschlägt, weil shellexecute unbekannt ist - in meiner Usesliste ist als erstes Winapi.Windows eingetragen ist - so hab ich denn ShellAPI dazugefügt. Komischerweise weiss Delphi selbst nichts von seinem guten Bekannten. Ein kleiner Hinweis auf der entsprechenden Helpseite, und man wüsste, was einzubinden ist. Und die Entwicklung mit Delphi wäre noch schneller! Gegenwärtiger Stand: wie ich erwartet hatte, moniert sich Delphi am Parameter PDFCreator. Die fehlenden PChar-Umwandlungen machen sich wohl erst später bemerkbar. Aber was soll der Parameter PDFCreator sein? Das Handle der von der RunDll zu startenden Anwendung? Gruss Delbor |
AW: Shellexecute richtig anwenden/übersetzen
Das "PDFCreator" ist keine Variable sondern einfach in Anführungszeichen gesetzt - daher auch die Backslashes jeweils vor den Quotes.
Grüße Dalai |
AW: Shellexecute richtig anwenden/übersetzen
Da in Delphi die Anführungszeichen ja eh anders sind, wäre die richtige Umsetzung dann wohl:
Delphi-Quellcode:
ShellExecute('RUNDLL32.exe', 'PRINTUI.DLL,PrintUIEntry /k /n "PDFCreator"', '', 'open', 1);
|
AW: Shellexecute richtig anwenden/übersetzen
Hi zusammen
Danke euch beiden. PDFCreator ist somit eine Art "Mitparameter"... Natürlich funktioniertdies aber immer noch nicht, da Shellexecute als ersten Parameter ein Handle erwartet. Dementsprechend meine Fehlermeldungen: Zitat:
Delphi-Quellcode:
Ich seh hier nicht die geringste Spur eines Handles. Selbst wenn der eigentliche Aufruf der Windowsfunktion Shellexecute in einer gleichnamigen Methode des JS-Objektes 'objshell' liegen würde (worauf dieser Code mE hinweist), müste dieesem das aktuele Handle mitgeteilt werden. Oder liege ich da falsch?
var objShell = new ActiveXObject("Shell.Application");
... ... objShell.ShellExecute("RUNDLL32.exe", "PRINTUI.DLL,PrintUIEntry /k /n \"PDFCreator\"", "", "open", 1); Gruss Delbor PS: Offenbar gar nicht so ![]() |
AW: Shellexecute richtig anwenden/übersetzen
So wie ich das sehe, wird das Handle da nicht benötigt.
![]() |
AW: Shellexecute richtig anwenden/übersetzen
Da wird wohl intern das Handle der Application übergeben. In Delphi kapselt Application.MessageBox ja auch die Win32-MessageBox, so dass man da kein Handle angeben muss.
|
AW: Shellexecute richtig anwenden/übersetzen
Zitat:
Delphi-Quellcode:
Vielleicht klappt das?
uses ShellApi;
... function ExecuteShell(const Executable, Commands: String; const ShowConsole: Boolean): Cardinal; var ProcessInfo: TShellExecuteInfo; begin Result := Cardinal($FFFFFFFF); FillChar(ProcessInfo, SizeOf(TShellExecuteInfo), #0); with ProcessInfo do begin cbSize:= SizeOf( TShellExecuteInfo ); fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; Wnd := GetActiveWindow(); lpVerb := 'open'; lpFile:= PChar(Executable); lpParameters := PChar(Commands); lpDirectory := PChar(ExtractFilePath(Executable)); // <<-- diese zeile könnte probleme verursachen, eventuell anpassen (!) if ShowConsole then nShow := SW_SHOWDEFAULT else nShow := SW_HIDE; end; if ShellExecuteEx(@ProcessInfo) then begin if not GetExitCodeProcess(ProcessInfo.hProcess, Result) then Result := Cardinal($FFFFFFFF); // GetExitCodeProcess(ProcessInfo.hProcess, Result); CloseHandle(ProcessInfo.hProcess); end else begin Result := GetLastError; exit; end; end; ... ExecuteShell('RUNDLL32.exe', 'PRINTUI.DLL,PrintUIEntry /k /n "PDFCreator"', True); |
AW: Shellexecute richtig anwenden/übersetzen
Hi KodeZwerg
Vielen Dank für deinen Code - funktioniert bestens und erzeugt mir so ein durchsuchbares Test-PDF. Alles, was mir jetzt noch bleibt,ist, die Quelle zu ändern - der Scanner liefert mir ein Bmp, bzw. ein von mir daraus erstelltes Jpeg. Aber das sollte eigentlich kein Problem mehr sein. Gruss Delbor |
AW: Shellexecute richtig anwenden/übersetzen
Freut mich das es klappt, nicht vergessen, habs oben nicht erwähnt, fehlercode prüfen/auswerten.
$FFFFFFFF = totaler fehler nun kommt es darauf an, man hat entweder den init-rückgabe wert der ShellExecuteEx oder einen vom System GetLastError auszuwerten. shau am besten mal in doku nach dessen rückgabewerte, meine sind unbrauchbar/veraltet. (ich kann dir mit dem creator nicht helfen, habe das teil nicht) Viel Erfolg dabei, spiel damit ruhig rum, ich könnte mir vorstellen das lpDirectory in deinem speziellen fall (rundll) da ärger macht, aber wenn du bereits was damit erreichen konntest, um so besser :) /edit ps: ich habe es von ![]() |
AW: Shellexecute richtig anwenden/übersetzen
Zitat:
![]() ![]() Grüße Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz