Aufruf ShellExecuteA Alternative zu RunShell [erledigt]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Aufruf ShellExecuteA Alternative zu RunShell [erledigt]

Beitrag von Bertram Hansen »

Hallo,

im Moment bin ich dabei eine Alternative für die Funktion

Code: Alles auswählen

RunShell("/C AUSPACKEN.EXE -y >> c:\TMP\ENTPACK.LOG")
zu finden, weil das leider ab Windows 8 nicht mehr funktioniert. Hier wird die Datei AUSPACKEN.EXE mit dem Parameter -y (alle Dateien ohne Abfrage entpacken) aufgerufen und zusätzlich wird über ">> c:\TMP\ENTPACK.LOG" das Ergebnis in eine Protokolldatei geschrieben.

Also habe ich versucht dafür die API Funktion ShellExecuteA zu verwenden. Das funktioniert aber nur teilweise.
Beispiel 1 (funktionert)

Code: Alles auswählen

nRet := ShellExecuteA( 0, "open", "AUSPACKEN.EXE", "-y", CurDir(), 1 )
Beispiel 2 (funktioniert leider nicht)

Code: Alles auswählen

nRet := ShellExecuteA( 0, "open", "AUSPACKEN.EXE", "-y >> c:\TMP\ENTPACK.LOG", CurDir(), 1 )
Dabei erhalte ich die Fehlernummer 42 (Network device type incorrect)
Hat jemand eine Idee? Ich möchte irgendwie das Ergebnis über den Auspackvorgang in eine Protokolldatei schreiben.
Zuletzt geändert von Bertram Hansen am Fr, 17. Jan 2014 15:29, insgesamt 1-mal geändert.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von AUGE_OHR »

hi,

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

der 3th. Parameter lpFile sollte den vollen Path enthalten
Strings sollten mit CHR(0) abgeschlossen werden.

ob du eine Umleitung mit >> so machen kannst ... hab es noch nicht probiert.
aber warum schreibst du nicht, mit FWRITE(), eine CMD wo

Code: Alles auswählen

PATH+"AUSPACKEN.EXE -y >> c:\TMP\ENTPACK.LOG" 
drin steht und rufst die auf ?
gruss by OHR
Jimmy
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von Magic »

Hi,

ich nutze es so:

Code: Alles auswählen

   lSuccess := DllCall( "SHELL32.DLL"  , DLL_STDCALL, ;
            "ShellExecuteA", AppDesktop():GetHWND(), "open", cPath+cFile,;
            NIL, CurDir(), SW_NORMAL )
oder auch so:

Code: Alles auswählen

RunDefaultShellProg( cFile, SHELL_PRINT, SW_MINIMIZE )
bzw.
RunDefaultShellProg( cFile, SHELL_OPEN, SW_MAXIMIZE )


******************************************************************************
FUNCTION RunDefaultShellProg( cFile, cMode, nShow )
 * Ein Standardprogramm öffnen oder über ein Standardprogramm drücken
 * Parameter: cFile -> Datei welche geöffnet oder gedruckt werden soll
 *            cMode -> SHELL_OPEN  für Datei öffnen
 *                  -> SHELL_PRINT für Datei drucken
 *            nShow -> SW_MAXIMIZE
 *                  -> SW_MINIMIZE
 * Return   : NIL
******************************************************************************

   LOCAL  nRet := 0

   DO CASE
      CASE cMode == SHELL_PRINT
         // Druck im Hintergrund starten
         nRet := WinAPIPrint( cFile, , , nShow )
         IF ! (nRet > 32)
            MsgBox( ... )
           nRet := -1
         ENDIF

      CASE cMode == SHELL_OPEN
         nRet := WinAPIOpen( cFile, , , nShow )
         IF ! nRet
            MsgBox( ... )
           nRet := -1
         ENDIF
   ENDCASE

RETURN nRet


FUNCTION WinAPIPrint( cFile, cParms, cDirectory, nOpenMode )

   DEFAULT nOpenMode  TO SW_HIDE, ;
           cDirectory TO CurDir()

RETURN wapiShellExecute( AppDesktop():GetHWND(), "print", cFile, cParms, CurDir(), nOpenMode )



FUNCTION WinAPIOpen( cFile, cParms, cDirectory, nOpenMode )

   DEFAULT nOpenMode  TO SW_HIDE, ;
           cDirectory TO CurDir()

RETURN wapiShellExecute( AppDesktop():GetHWND(), "open", cFile, cParms, CurDir(), nOpenMode ) > 32



FUNCTION wapiShellExecute( nHWND,cOperation,cFile,cParms,cDirectory,nOpenMode)

   STATIC cTpl := NIL
   LOCAL nDll  :=DllLoad("SHELL32.DLL")
   LOCAL xRet  := NIL

   if cTpl == NIL
      cTpl := DllprepareCall(nDll,32 ,"ShellExecuteA")
   endif

   xRet := DLLExecuteCall( cTpl , nHWND,cOperation,cFile,cParms,cDirectory,nOpenMode )

RETURN xRet
Vielleicht hilft es Dir ein wenig weiter?
Gruß,
Magic
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von Bertram Hansen »

AUGE_OHR hat geschrieben:hi,

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

der 3th. Parameter lpFile sollte den vollen Path enthalten
Strings sollten mit CHR(0) abgeschlossen werden.
Hallo Jimmy,

ich übergebe im 3. Parameter den kompletten Pfad (z.B. c:\tmp\AUSPACKEN.EXE). Wenn ich im 4. Parameter nur den Wert "-y" eintrage, dann funktioniert auch das Entpacken. Aber sobald ich zusätzlich ">> c:\TMP\ENTPACK.LOG" mit übergebe, kommt die Fehlermeldung.

Was genau meinst Du mit
AUGE_OHR hat geschrieben:aber warum schreibst du nicht, mit FWRITE(), eine CMD wo

Code: Alles auswählen

PATH+"AUSPACKEN.EXE -y >> c:\TMP\ENTPACK.LOG" 
drin steht und rufst die auf ?
Ich stehe da irgendwie auf dem Schlauch.

Das Ergebnis nach in der Protokolldatei ENTPACK.LOG sieht z.B. so aus:

Code: Alles auswählen

Processing archive: c:\tmp\AUSPACKEN.EXE

Extracting  File1.exe
Extracting  File2.exe
Extracting  File3.dbf

Everything is Ok
Ich möchte das Ergebnis aus dem Entpackvorgang irgendwie protokollieren. Und bisher hat das mit

Code: Alles auswählen

RunShell("/C AUSPACKEN.EXE -y >> c:\TMP\ENTPACK.LOG")
bis einschließlich Windows 7 funktioniert.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von Bertram Hansen »

Nachtrag für Jimmy,

wenn ich im 4. Parameter den Wert mit CHR(0) übergebe,

Code: Alles auswählen

CHR(0)+"-y >> c:\TMP\ENTPACK.LOG"+CHR(0)
funktioniert das Entpacken, aber ich erhalte keine Protokolldatei und die Rückmeldung Fehler-Nr. 42 erscheint.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von brandelh »

du hast oben aber auch am Anfang des Strings ein chr(0) ?
Gruß
Hubert
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von Bertram Hansen »

Ja das stimmt. Wenn ich am Anfang und am Ende CHR(0) zusätzlich übergebe, dann wird die Datei entpackt, aber ohne Protokoll und mit der Fehlernummer.
Wenn ich entweder am Anfang oder am Ende CHR(0) übergebe, dann bekomme ich nur die Fehlernummer, aber die Datei wird NICHT entpackt.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von brandelh »

teste mal die andere Syntax:

Code: Alles auswählen

runshell(cParameter,cAusführendesProgramm, ... )
so rufe ich z.B. Acrobat mit der gewünschten Datei auf:

Code: Alles auswählen

runshell(cPfad+cPDF,cAcrobat,.t.)
In beiden Fariablen hinterlege ich immer den kompletten Pfad !
Enthält dieser Blanks, MUSS am Anfang und am Ende ein chr(34) angehängt werden !
Gruß
Hubert
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von Bertram Hansen »

Hallo,

so ich habe jetzt mal einiges probiert.

Generell gibt es bei der Funktion ShellExecuteA() auch den Rückgabewert 42. Laut der Seite
http://www.chf-online.de/api/prgstart.htm
bedeutet der Rückgabewert 42, das kein Fehler aufgetreten ist. :D

Wenn ich jetzt die Funktion wie folgt aufrufe

Code: Alles auswählen

nRet := ShellExecuteA( 0, "open", "cmd.exe", "/C c:\TMP\AUSPACKEN.EXE -y >> c:\TMP\ENTPACK.LOG", CurDir(), 1 )
dann werden die Daten entpackt, die Protokolldatei angelegt und ich erhalten den Rückgabewert 42.

Dieser Aufruf ist falsch!!

Code: Alles auswählen

nRet := ShellExecuteA( 0, "open", "AUSPACKEN.EXE", "-y >> c:\TMP\ENTPACK.LOG", CurDir(), 1 )
[/color]

Vielen Dank für Eure Hilfe.
Das Thema ist für mich erledigt.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Aufruf ShellExecuteA Alternative zu RunShell

Beitrag von AUGE_OHR »

Bertram Hansen hat geschrieben:Was genau meinst Du mit
AUGE_OHR hat geschrieben:aber warum schreibst du nicht, mit FWRITE(), eine CMD wo

Code: Alles auswählen

PATH+"AUSPACKEN.EXE -y >> c:\TMP\ENTPACK.LOG" 
drin steht und rufst die auf ?
Ich stehe da irgendwie auf dem Schlauch.
ich schreibe mit FWRITE() eine BATch Datei welche ich dann aufrufe.
Bertram Hansen hat geschrieben:wenn ich im 4. Parameter den Wert mit CHR(0) übergebe
wie ich schon schrieb
Strings sollten mit CHR(0) abgeschlossen werden.
das gilt für alle Strings die man an API Functionen übergibt.
gruss by OHR
Jimmy
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Aufruf ShellExecuteA Alternative zu RunShell [erledigt]

Beitrag von Bertram Hansen »

Ok Jimmy.
Jetzt habe auch ich das verstanden. :D
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Antworten