Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Frage zu WinExec (https://www.delphipraxis.net/30200-frage-zu-winexec.html)

Drysek 21. Sep 2004 22:23


Frage zu WinExec
 
Hallo,

ich möchte einen Drucker unter Windows hinzufügen das funktioniert auch alles wunderbar in der Komandozeile.

Hier der Aufruf:

rundll32 printui.dll,PrintUIEntry /if /b "Testdrucker" /f %windir%\inf\ntprint.inf /r "lpt1:" /m "AGFA-AccuSet v52.3"


Wenn ich das gleiche aber mit WinExec aufrufe bekomme ich einen Fehler der mir nichts sagt:
"Der Vorgang konnte nicht abgeschlossen werden"

str := 'rundll32 printui.dll,PrintUIEntry /if /b "Testdrucker" /f %windir%\inf\ntprint.inf /r "lpt1:" /m "AGFA-AccuSet v52.3"';

WinExec(str, SW_NORMAL);

Ich habe es auch schon mit ShellExcecute probiert aber leider auch ohne Erfolg

Ich habe die Vermutung das die Fehlerquelle in den Parametern liegt,
wenn ich Win- und ShellExecute aufrufe.

Die AddPrinter Funktion der WinApi wird anscheinend nicht unter XP unterschtützt.

Währe toll wenn mir jemand einen Lösungsvorschlag geben könnte.

NicoDE 21. Sep 2004 22:26

Re: Frage zu WinExec
 
Zitat:

Zitat von Drysek
das funktioniert auch alles wunderbar in der Komandozeile.

Auf der Kommandozeile werden die Umgebungsvariablen (%windir%) ersetzt. Sieh Dir mal ExpandEnvironmentStrings u.s.w. an.

Luckie 21. Sep 2004 22:39

Re: Frage zu WinExec
 
Und benutze nicht MSDN-Library durchsuchenWinExec, sondern MSDN-Library durchsuchenShellexecute, da WinExec nur noch wegen der abwärtskompatibilität zu 16-Bit Programmen vorhanden ist und von MS als obsolet gekennzeichnet ist.

Drysek 21. Sep 2004 23:15

Re: Frage zu WinExec
 
Hi dann frage ich mal anders, warum klappt folgender Aufruf nicht !

ShellExecute(Form1.Handle, 'open', 'rundll32 printui.dll,PrintUIEntry', '/if /b "Test Printer2" /f "%windir%\inf\ntprint.inf" /r "TestPort:" /m "Apple Color LW 12/660 PS', '', SW_NORMAL);

Wenn ich ihn so ausführe passiert anscheinned rein gar nix, ich vermute aber das der Befehl
nicht bis zu Ende ausgeführt wird, sondern vorher abgebrochen wird.

Also was mache ich falsch !!! Kann ja eigentlich nicht so schwer sein !!

mfg

Drysek

Luckie 21. Sep 2004 23:20

Re: Frage zu WinExec
 
Das hat dir doch Nico gerade erklärt: Die Umgebungsvariable %windir% wird von "Ausführen" automatisch aufgelöst, von Shellexecute aber nicht. Und wie du das Problem löst hat er dir auch gesagt.

Drysek 22. Sep 2004 00:34

Re: Frage zu WinExec
 
Hi, erstma Danke das Ihr euch mit meiner Fragestellung beschäftigt !

Hab euren Ratschlag beherzigt und habe die Systemvariable mit folgendem Code umgewandelt !


Delphi-Quellcode:
var
   strPath : String;
   Buf : array[0..MAX_PATH] of Char;
   x : THandle;
begin
   strPath := '%windir%';
   ExpandEnvironmentStrings(PCHAR(strPath), Buf, sizeof(Buf));
   strPath := ' /if /b "Test Printer2" /f "' + Buf + '\inf\ntprint.inf" /r "TestPort:" /m "Apple Color LW 12/660 PS"';
   x := ShellExecute(0, 'open', 'rundll32 printui.dll,PrintUIEntry', Pchar(strPath), NIL, SW_NORMAL);
   ShowMessage(IntToStr(x));
Leider funktioniert der Aufruf ShellExecute mit den von mir übergebenen Parametern immer noch nicht ! Ich finde den Fehler einfach nicht !!
Wäre nett wenn Ihr mir bitte noch einmal nen Tipp geben könntet ! Vielleicht liegts ja an der Parameterübergabe an ShellExecute ??

Ach ja ShellExecute gibt den FehlerCode 2 zurück -> ERROR_PATH_NOT_FOUND

mfg

Drysek

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

NicoDE 22. Sep 2004 00:47

Re: Frage zu WinExec
 
Zitat:

Zitat von Drysek
Code:
ShellExecute(0, 'open', [color=red]'rundll32 printui.dll,PrintUIEntry'[/color], Pchar(strPath), NIL, SW_NORMAL);

Die rot markierte Datei gibt es auf Deinem System sicher nicht (sollte nur 'rundll32' sein). Die Bezeichnung strPath ist etwas unglücklich gewählt für einen String der die Parameter enthält...

Sprint 22. Sep 2004 01:09

Re: Frage zu WinExec
 
Zitat:

Zitat von Drysek
Leider funktioniert der Aufruf ShellExecute mit den von mir übergebenen Parametern immer noch nicht ! Ich finde den Fehler einfach nicht !!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  Param = 'printui.dll,PrintUIEntry /if /b "Testdrucker" /f %windir%\inf\ntprint.inf /r "lpt1:" /m "AGFA-AccuSet v52.3"';
var
  S: String;
begin

  SetLength(S, ExpandEnvironmentStrings(Param, nil, 0));
  SetLength(S, ExpandEnvironmentStrings(Param, PChar(S), Length(S)) - 1);
  ShellExecute(0, 'open', 'RunDLL32.exe', PChar(S), nil, SW_SHOWNORMAL);

end;

supermuckl 22. Sep 2004 02:36

Re: Frage zu WinExec
 
steht in S auch wirklich der string drin den du haben willst ?

Sprint 22. Sep 2004 02:43

Re: Frage zu WinExec
 
Zitat:

Zitat von supermuckl
steht in S auch wirklich der string drin den du haben willst ?

Da musste ich echt lachen, als ich deine Frage gelesen hab. :)
Probier's doch aus. :coder:

supermuckl 22. Sep 2004 02:46

Re: Frage zu WinExec
 
na dann fahr ich halt meinen anderen PC hoch und komm ausm bett raus ;)

Sprint 22. Sep 2004 02:49

Re: Frage zu WinExec
 
Zitat:

Zitat von supermuckl
na dann fahr ich halt meinen anderen PC hoch und komm ausm bett raus ;)

Aber nicht das ich schuld hab', das du nicht genug schlaf bekommst. :)

NicoDE 22. Sep 2004 02:53

Re: Frage zu WinExec
 
Zitat:

Zitat von supermuckl
steht in S auch wirklich der string drin den du haben willst ?

Das kommt auf die Parameter an... wenn in den anderen Paramtern zufällig Umgebungsvariablen vorkommen, dann steht nicht mehr das drin, was eigentlich beabsichtigt war *g*

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Params: string;
  Return: HINST;
begin
  Params := 'printui.dll,PrintUIEntry' +
    ' /if' +
    ' /b "Testdrucker"' +
    ' /f "' + GetEnvironmentVariable('windir') + '\inf\ntprint.inf"' +
    ' /r "lpt1:"' +
    ' /m "AGFA-AccuSet v52.3"';
  Return := ShellExecute(Handle, 'open', 'rundll32', PChar(Params), nil,
    SW_SHOWNORMAL);
  if (Return <= 32) then
    ShowMessage(SysErrorMessage(Return));
end;

supermuckl 22. Sep 2004 02:54

Re: Frage zu WinExec
 
nönö ;)

also bei mir gehts.. habs 1:1 übernommen

bin eingeloggt als administrator

in Windoof 2003 deutsch

Delphi6 ent

button geklickt -> mauszeiger(sanduhr) -> Testdrucker in "Drucker" erschienen

supermuckl 22. Sep 2004 02:57

Re: Frage zu WinExec
 
und in S steht:

Code:
printui.dll,PrintUIEntry /if /b "Testdrucker" /f C:\WINDOW3\inf\ntprint.inf /r "lpt1:" /m "AGFA-AccuSet v52.3"

Sprint 22. Sep 2004 03:01

Re: Frage zu WinExec
 
Hätte Drysek ganz einfach gefragt wie man einen Drucker per API Aufruf installiert, dann hätte er von mir auch eine eleganteres Beispiel bekommen.

supermuckl 22. Sep 2004 03:05

Re: Frage zu WinExec
 
[OT]
da kenn ich n nettes sprichwort :)

"hätte der fuchs nicht geschissen hätte er einen hase gefangen"

oder in meiner 2. muttersprache:

"hät do fuchs net gschissn hätto n has gfanga hailandzacknochomool"

[/OT]

Drysek 22. Sep 2004 07:32

Re: Frage zu WinExec
 
Hi danke für euer Feedbacks es funktioniert jetzt auch bei mir !!!
Tausend Dank

mfg

Drysek

p.s. wenn ich auf eure Antwort Zeit gucke ohh Mann !! ;)

mfg

Drysek


Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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