Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von Eugeny Lutsenko »

Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
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: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von brandelh »

RunShell() ist die Funktion die das macht, da hat sich seit der 1.xx nichts geändert.
Gruß
Hubert
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von Dominik Krebs »

Sonst gibt's es nichts?
Würde mich nämlich auch interessieren. Das cmd Fenster sehen, wenn auch minimiert, stört dann dennoch manchmal.
Gruß Dominik
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: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von brandelh »

Das kann man doch verstecken oder nicht ?

Eventuell mal über die Betriebssystem API Funktion shellexecute() oder so ähnlich versuchen.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von Tom »

Es sind vor einiger Zeit zwei neue Parameter hinzugekommen, aber asynchrone Prozesse zu verstecken, die man per RunShell() spawnt, das geht schon immer. Einfach mal die Doku lesen.
Herzlich,
Tom
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: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von AUGE_OHR »

hi,

RunShell() nutzt die Console

Code: Alles auswählen

   bResult = CreateProcess
             (
      NULL,
      ( char * ) hb_parc( 1 ),
      NULL,
      NULL,
      TRUE,
      CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
      NULL,
      HB_ISNIL( 2 ) ? NULL : hb_parc( 2 ),
      &stInfo,
      &prInfo
             );
und die API Function WaitForSingleObject() wenn man auf das "Fenster" warten soll

---

ShellExecuteA() = "OpenShell()" ist "eigentlich" für die Verknüpfung mit Extension gedacht um die zugehörige App zu aktivieren ("open", "print" ... "runas")

man kann damit aber jede App, optional mit Parameter, starten. diese läuft im eigenen Thread also KEIN "Waitstate"

Code: Alles auswählen

   // v1.9 Syntax also for harbour ANSI Version
   lSuccess := DllCall( "SHELL32.DLL"  , DLL_OSAPI , ;
            "ShellExecuteA",;
             0, ;
             "open", ;
             cPath+cFile,;
             cParameter,;
             CurDir(), IF(lShow,SW_NORMAL,SW_HIDE) )
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von georg »

Hallo, Jimmy -


danke für Deine Beispiele, aber ... irgendwie nutzlos, da (ich nehme jetzt nur mal das zweite) etliches nicht definiert ist (nehmen wir mal SW_HIDE, findest sich in keiner der Alaska ch-Dateien) und somit nicht kompilier- und testbar ist.

Das gilt in verstärktem Masse für das erste Beispiel, wo mir noch nicht mal klar ist, welche Sprache das sein soll? hb_isnil() und hb_parc() erzeugen bei mir einen "unresolved external".

Ich hätte mir das gerne angesehen (und habe es auch versucht), aber leider - ohne Erfolgschance, wenn Du keine weiteren Informationen beisteuerst.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von HaPe »

Hallo Georg !
... etliches nicht definiert ist (nehmen wir mal SW_HIDE, findest sich in keiner der Alaska ch-Dateien) und somit nicht kompilier- und testbar ist.
SW_HIDE ist ein DEFINE der Windows C-API für zb. ShowWindow
*-- SW_HIDE 0 Hides the window and activates another window.
hb_isnil() und hb_parc()
Könnte das was von Hubert Brandel sein?
Zuletzt geändert von HaPe am Do, 17. Dez 2020 12:39, insgesamt 2-mal geändert.
--
Hans-Peter
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von Jan »

Ich tippe da eher auf harbour. Aber solange Jimmy da nichts zu sagt bleibt das wohl eine Raterunde.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von AUGE_OHR »

hi,
georg hat geschrieben: Do, 17. Dez 2020 11:04 danke für Deine Beispiele, aber ... irgendwie nutzlos, da (ich nehme jetzt nur mal das zweite) etliches nicht definiert ist (nehmen wir mal SW_HIDE, findest sich in keiner der Alaska ch-Dateien) und somit nicht kompilier- und testbar ist.
schon mal an die "Such" Funktion des Forum gedacht ... :roll:

nun ja, wie HaPe erklärt hat sind das API Konstanten die ich mit Ot4xb.CH erhalten habe.
es wäre wohl deutlicher gewesen wenn ich die Ot4Xb Syntax gepostet hätte mit

Code: Alles auswählen

@Shell32:"ShellExecuteA"(
statt

Code: Alles auswählen

DllCall( "SHELL32.DLL"  , DLL_OSAPI , ;
aber ich wollte zeige da man den "selben Code" auch unter harbour verwenden kann

p.s. das erste Mal tauchte die Function in der Alaska Newsgroup vor 20 Jahren auf

Code: Alles auswählen

   // ----------------------------------------------------------
   //   Created from ContactUs.PRG
   //   Posted to Alaska Generic NG 3/15/01
   //   By Anand K Gupta  Sun, 24 Dec 2000
   // -----------------------------------------------------------
   //  #define SW_HIDE             0
   //  #define SW_NORMAL           1
   //  #define SW_SHOWMINIMIZED    2
   //  #define SW_SHOWMAXIMIZED    3
   //  #define SW_MAXIMIZE         3
   //  #define SW_SHOWNOACTIVATE   4
   //  #define SW_SHOW             5
   //  #define SW_MINIMIZE         6
   //  #define SW_SHOWMINNOACTIVE  7
   //  #define SW_SHOWNA           8
   //  #define SW_RESTORE          9
   //  #define SW_SHOWDEFAULT      10
   //  #define SE_ERR_NOASSOC      31
georg hat geschrieben: Do, 17. Dez 2020 11:04 Das gilt in verstärktem Masse für das erste Beispiel, wo mir noch nicht mal klar ist, welche Sprache das sein soll? hb_isnil() und hb_parc() erzeugen bei mir einen "unresolved external".
der Pre-Fix "hb_" ist von harbour und stellen den Type des Parameter dar den man übergeben will.

unter Xbase++ mit Ot4xb ist es etwas kompilzierter als unter "C"

Code: Alles auswählen

INLINE CLASS METHOD _CreateProcess_(cUser,cPwd,app,cmd,pa,ta,ih,flags,env,cd,psi,ppi)
       DEFAULT pa :=  {12,0,0} ; DEFAULT ta :=  {12,0,0}
       if cUser == NIL            
          return FpQCall( {"kernel32","CreateProcessA"} ,;
                          "__bo__pt__pt__pt__pt__bo__sl__pt__pt__pt__pt",;
                          app,cmd,pa,ta,ih,flags,env,cd,psi,@ppi ;
                        )
       end          
       DEFAULT cUser := ""
       DEFAULT cPwd  := 0  
       PokeStr(cmd,0,cSzAnsi2Wide(PeekStr(cmd,0,-1)))
       return FpQCall( {"advapi32","CreateProcessWithLogonW"} ,;
                      "__boc_swc_swc_sw__slc_sw__pt__sl__ptc_sw__pt__pt",;
                          cUser,".",cPwd,1,app,cmd,flags,env,cd,psi,@ppi ;
                     )
georg hat geschrieben: Do, 17. Dez 2020 11:04 Ich hätte mir das gerne angesehen (und habe es auch versucht), aber leider - ohne Erfolgschance, wenn Du keine weiteren Informationen beisteuerst.
es geht um das 2nd Beispiel mit ShellExecuteA ... Console ist doch so was von ALT ... :roll:
such mal nach "ShellExecuteA" im Forum und du wirst sicherlich einige Versionen finden.

dabei ist vielleicht nicht jedem bewusst das man mit den Parameter "spielen" kann.
"open" nicht das einzige "Verb" (Elemente des Context Menu) was man gebrauchen kann.
gruss by OHR
Jimmy
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: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von brandelh »

Ich lese immer Console ...

Ich bin mir sicher, dass RunShell() bei Xbase++ intern auch den shellexecuteA() nutzt.
Manche Befehle benötigen eine CMD, aber nicht alle und das kann man leicht ausprobieren ...

Wenn man CMD oder DIR etc. startet, erscheint in der Taskleiste bei synchronem Aufruf auch eine schwarze Box (cmd) ...

wenn ICH aber so den Acrobat Reader asynchron aufrufe, sehe ich nur die EXE (Xbase++) und den AdopeAcrobat (oder sonstiges Anzeigeprogramm).
Das sieht gut aus und ist sehr leistungsfähig.

Code: Alles auswählen

  if file(cPfad+cPDF)
      if ! file(cAcrobat)
         cAcrobat := GetStandardProgramm(cPDF, cPfad)
      endif
      runshell(cPfad+cPDF,cAcrobat, .t. )
   endif

? "ENDE"

   inkey(30)

return

*--------------------------------------------------------------------------
function GetStandardProgramm(cFile, cPath)   // cPath force to EXE
   local cExe := ChrR(0,260) // MAX_PATH is 260
   if empty(cPath)
      cPath := cAppDir()
   endif
   if @shell32:FindExecutableA(cFile, cPath, @cExe) < 32
      cExe := ""
   else
      cExe := TrimZ(cExe)
   end
return cExe
Gruß
Hubert
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: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von AUGE_OHR »

brandelh hat geschrieben: Do, 17. Dez 2020 20:34 Ich lese immer Console ...

Ich bin mir sicher, dass RunShell() bei Xbase++ intern auch den shellexecuteA() nutzt.
schon mal mit ShellexecuteA() eine *.BAT versucht :?:

ShellExecute kann nur eine "Verknüpfung" ausführen wenn er die Extension "kennt" und *.BAT gehört zu den "System Extension"

---

unter Xbase++ ist TRunShell von Pablo "die" Lösung wenn man "mehr" will.
als Rückgabe bekommt man das Handle von CreateProcess() und kann zur Not auch eine gestartete App "abschliessen"
gruss by OHR
Jimmy
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: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

Beitrag von brandelh »

was ich meinte ist, dass nur weil man mit einer *.CMD im Aufruf einen CMD.EXE startet, das nicht bedeutet, dass das immer der Fall ist.
Wenn ich eine andere EXE starte und die Parameter übergeben (z.B. Acrobat Reader), ist zumindest keine Console zu sehen !

*.BAT ... das war zu DOS / Win 98 Zeiten, seit NT nutze ich ausschließlich *.CMD ;-)
Gruß
Hubert
Antworten