Seite 1 von 1

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

Verfasst: So, 13. Dez 2020 20:28
von Eugeny Lutsenko
Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?

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

Verfasst: So, 13. Dez 2020 23:51
von brandelh
RunShell() ist die Funktion die das macht, da hat sich seit der 1.xx nichts geändert.

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

Verfasst: Di, 15. Dez 2020 22:35
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.

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

Verfasst: Mi, 16. Dez 2020 12:49
von brandelh
Das kann man doch verstecken oder nicht ?

Eventuell mal über die Betriebssystem API Funktion shellexecute() oder so ähnlich versuchen.

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

Verfasst: Mi, 16. Dez 2020 13:04
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.

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

Verfasst: Do, 17. Dez 2020 7:16
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) )

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

Verfasst: Do, 17. Dez 2020 11:04
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.

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

Verfasst: Do, 17. Dez 2020 11:56
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?

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

Verfasst: Do, 17. Dez 2020 12:18
von Jan
Ich tippe da eher auf harbour. Aber solange Jimmy da nichts zu sagt bleibt das wohl eine Raterunde.

Jan

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

Verfasst: Do, 17. Dez 2020 12:59
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.

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

Verfasst: Do, 17. Dez 2020 20:34
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

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

Verfasst: Mo, 28. Dez 2020 10:31
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"

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

Verfasst: Mo, 28. Dez 2020 11:59
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 ;-)