AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Shellexecute richtig anwenden/übersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Shellexecute richtig anwenden/übersetzen

Ein Thema von Delbor · begonnen am 15. Okt 2018 · letzter Beitrag vom 17. Okt 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#1

AW: Shellexecute richtig anwenden/übersetzen

  Alt 15. Okt 2018, 14:11
Das "PDFCreator" ist keine Variable sondern einfach in Anführungszeichen gesetzt - daher auch die Backslashes jeweils vor den Quotes.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#2

AW: Shellexecute richtig anwenden/übersetzen

  Alt 15. Okt 2018, 14:19
Da in Delphi die Anführungszeichen ja eh anders sind, wäre die richtige Umsetzung dann wohl:
  ShellExecute('RUNDLL32.exe', 'PRINTUI.DLL,PrintUIEntry /k /n "PDFCreator"', '', 'open', 1);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Shellexecute richtig anwenden/übersetzen

  Alt 15. Okt 2018, 16:31
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:
[dcc32 Fehler] PDFCreatorFrameUnit.pas(73): E2010 Inkompatible Typen: 'HWND' und 'string'
[dcc32 Fehler] PDFCreatorFrameUnit.pas(73): E2010 Inkompatible Typen: 'PWideChar' und 'Integer'
[dcc32 Fehler] PDFCreatorFrameUnit.pas(84): E2035 Nicht genügend wirkliche Parameter
[dcc32 Fataler Fehler] F2063 Verwendete Unit 'PDFCreatorFrameUnit.pas' kann nicht compiliert werden
Nachstehend 2 Zeilen aus dem Beispiel, das die Verwendung da aufzeigen soll:
Delphi-Quellcode:
var objShell = new ActiveXObject("Shell.Application");
...
...
objShell.ShellExecute("RUNDLL32.exe", "PRINTUI.DLL,PrintUIEntry /k /n \"PDFCreator\"", "", "open", 1);
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?

Gruss
Delbor

PS: Offenbar gar nicht so sehr...
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (15. Okt 2018 um 17:08 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#4

AW: Shellexecute richtig anwenden/übersetzen

  Alt 15. Okt 2018, 16:48
So wie ich das sehe, wird das Handle da nicht benötigt.

https://docs.microsoft.com/en-us/win...l-shellexecute
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#5

AW: Shellexecute richtig anwenden/übersetzen

  Alt 15. Okt 2018, 17:04
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#6

AW: Shellexecute richtig anwenden/übersetzen

  Alt 16. Okt 2018, 02:57
Ich seh hier nicht die geringste Spur eines Handles.
Nur der Vollständigkeit halber: Die Windows API-Funktion MSDN-Library durchsuchenShellExecute aus Shell32.dll erwartet ein Handle und hat auch sonst eine andere Signatur (=Parameter), wie man in der MS-Doku zu dieser Funktion nachlesen kann. Delphi verwendet genau diese Funktion, nicht Shell.ShellExecute, das offenbar ein in Skriptsprachen (z.B. VB) übliches Shellobjekt ist.

Grüße
Dalai
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Shellexecute richtig anwenden/übersetzen

  Alt 16. Okt 2018, 22:03
Hi zusammen

Die Prozedur von Kodezwerg macht keinerlei Probleme - dafür sorgt meine:
Delphi-Quellcode:
procedure TPDFCreatorFrame.ImageToPDF;
  var job : IPrintjob;
      jobinfo : IPrintJobInfo;
      PDFQueue : TQueue;
      LOutput : IOutputFiles;
begin
  PDFQueue := TQueue.Create(Self);
  try
    Showmessage('procedure TPDFCreatorFrame.ImageToPDF: Der Wert von FFilename ist: '+' "'+ FFilename + '" ');
// FFilename ist: 'C:\PDFOfficerAppdata\PdfOfficerData\ScannedPic.jpeg';
    PDFQueue.Initialize; // Initializing PDFCreator queue...
    ExecuteShell('RUNDLL32.exe', 'PRINTUI.DLL,PrintUIEntry /k /n "PDFCreator"', True);
    Showmessage('Setting up target path to: ' + Self.FFileName);
    Showmessage('Printing one windows test page...');
    if not PDFQueue.WaitForJob(10)then
      Showmessage('The print job did not reach the queue within ' + IntToStr(10) + ' seconds')
    else
      Showmessage('Currently there are ' + IntToStr(PDFQueue.Count) + ' job(s) in the queue');
    Showmessage('Getting job instance');
    job := PDFQueue.NextJob;

    jobinfo := job.PrintJobInfo;
    ShowMessage('jobinfo.PrintJobName := ' + jobinfo.PrintJobName); //<== Printjobname ist 'Testseite'
    job.SetProfileByGuid('DefaultGuid');
    Showmessage('Converting under \"DefaultGuid\" conversion profile');
    job.ConvertTo(FFileName);
    if not job.IsSuccessful and not job.IsFinished then
      Showmessage('Could not convert the file: ' + FFileName)
    else
      Showmessage('Job finished successfully');
    PDFQueue.ReleaseCom;
  finally
    PDFQueue.Free;
  end;
end;
Die Prozedure wird aufgerufen, wenn der Scanvorgang beendet ist, das gescannte Bild in Jpeg verwandelt und gespeichert ist. Von daher kommt der Wert von FFilename.
Stelle ichnur auf diesen Code ab, muss ich annehmen, dass PDFQueue bei der Initialisierung den Pfad erhält. Laut dem Beispieöcode ist das aber nicht der Fall:
Delphi-Quellcode:
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var objShell = new ActiveXObject("Shell.Application");

var Scriptname = objFSO.GetFileName(WScript.ScriptFullname);

if (WScript.Version < 5.6)
{
WScript.Echo("You need the \"Windows Scripting Host version 5.6\" or greater!");
WScript.Quit();
}


try
{
var PDFCreatorQueue = new ActiveXObject("PDFCreator.JobQueue");

WScript.Echo("Initializing PDFCreator queue...");
PDFCreatorQueue.Initialize();

{ hier ermittelt das Script den Pfad und übergibt den Pfad an das Objekt objFSO   -  gibts bei mir nicht}

 var fullPath = objFSO.GetParentFolderName(WScript.ScriptFullname) + "\\TestPage.jpg"; // Hier der Pfad zur Testseite
WScript.Echo("Setting up target path to: " + fullPath);
{Allerdings steht hier der Pfad erstmal in der Variablen "fullpath".  Wenn ich das richtig lese (und verstanden habe),führt Shellexecute in den folgenden Zeilen}
{Rundll32 aus, und diese PrintUI.DLL unter Angabe des Einsprungpunktes  -  von der Übergabe eines Dateinamens seh ich hier nichts} 
WScript.Echo("Printing windows test page...");
 objShell.ShellExecute("RUNDLL32.exe", "PRINTUI.DLL,PrintUIEntry /k /n \"PDFCreator\"", "", "open", 1);
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Shellexecute richtig anwenden/übersetzen

  Alt 17. Okt 2018, 06:32
moin, gibts zufällig "PDFQueue" <<-- darüber mehr informationen?
zeige mal bitte was "TQueue" ist.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Shellexecute richtig anwenden/übersetzen

  Alt 17. Okt 2018, 07:35
Hi Kodezwerg

Guten Morgen, Kodezwerg!
So ist die Definition in der TLB:
Delphi-Quellcode:
  IQueue = dispinterface
    ['{3803F46C-F5AA-4B86-8B9C-6EFFAC9CDCFA}']
    procedure Initialize; dispid 1610743808;
    function WaitForJob(timeOut: Integer): WordBool; dispid 1610743809;
    function WaitForJobs(jobCount: Integer; timeOut: Integer): WordBool; dispid 1610743810;
    property Count: Integer readonly dispid 1610743811;
    property NextJob: IPrintJob readonly dispid 1610743812;
    function GetJobByIndex(jobIndex: Integer): IPrintJob; dispid 1610743813;
    procedure MergeJobs(const job1: IPrintJob; const job2: IPrintJob); dispid 1610743814;
    procedure MergeAllJobs; dispid 1610743815;
    procedure Clear; dispid 1610743816;
    procedure DeleteJob(index: Integer); dispid 1610743817;
    procedure ReleaseCom; dispid 1610743818;
  end;
Und ddas sind die Definitionen der Wrapperkomponenten im Frame:
Delphi-Quellcode:
type
  TPDFCreatorFrame = class(TFrame)
    PdfCreatorObj1: TPdfCreatorObj;
    OutputFiles1: TOutputFiles;
    Printers1: TPrinters;
    PrintJob1: TPrintJob;
    PrintJobInfo1: TPrintJobInfo;
    Queue1: TQueue;
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Shellexecute richtig anwenden/übersetzen

  Alt 15. Okt 2018, 17:17
Da in Delphi die Anführungszeichen ja eh anders sind, wäre die richtige Umsetzung dann wohl:
  ShellExecute('RUNDLL32.exe', 'PRINTUI.DLL,PrintUIEntry /k /n "PDFCreator"', '', 'open', 1);
Delphi-Quellcode:
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);
Vielleicht klappt das?
Gruß vom KodeZwerg

Geändert von KodeZwerg (15. Okt 2018 um 17:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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