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 ...
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
statt
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 ...
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