Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
Moderator: Moderatoren
- Eugeny Lutsenko
- 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?
Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
RunShell() ist die Funktion die das macht, da hat sich seit der 1.xx nichts geändert.
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 15. Apr 2019 16:19
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 4 Mal
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
Sonst gibt's es nichts?
Würde mich nämlich auch interessieren. Das cmd Fenster sehen, wenn auch minimiert, stört dann dennoch manchmal.
Würde mich nämlich auch interessieren. Das cmd Fenster sehen, wenn auch minimiert, stört dann dennoch manchmal.
Gruß Dominik
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
Das kann man doch verstecken oder nicht ?
Eventuell mal über die Betriebssystem API Funktion shellexecute() oder so ähnlich versuchen.
Eventuell mal über die Betriebssystem API Funktion shellexecute() oder so ähnlich versuchen.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9388
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
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
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
hi,
RunShell() nutzt die Console
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"
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
);
---
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
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
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.
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.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- HaPe
- 1000 working lines a day
- Beiträge: 996
- 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?
Hallo Georg !
*-- SW_HIDE 0 Hides the window and activates another window.
SW_HIDE ist ein DEFINE der Windows C-API für zb. ShowWindow... 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 0 Hides the window and activates another window.
Könnte das was von Hubert Brandel sein?hb_isnil() und hb_parc()
Zuletzt geändert von HaPe am Do, 17. Dez 2020 12:39, insgesamt 2-mal geändert.
--
Hans-Peter
Hans-Peter
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
Ich tippe da eher auf harbour. Aber solange Jimmy da nichts zu sagt bleibt das wohl eine Raterunde.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
hi,
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
unter Xbase++ mit Ot4xb ist es etwas kompilzierter als unter "C"
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.
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
Code: Alles auswählen
@Shell32:"ShellExecuteA"(
Code: Alles auswählen
DllCall( "SHELL32.DLL" , DLL_OSAPI , ;
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
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 ;
)
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.
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
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.
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
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
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
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Was gibt es in Alaska 2.0, um externe Programme wie RunShell() auszuführen?
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
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
Hubert