Autor |
Beitrag |
Nothilvien
      
Beiträge: 19
|
Verfasst: Mi 08.10.08 01:38
Also mein problem:
Funktioniert nicht
Delphi-Quelltext 1:
| ShellExecute(Application.Handle,'open','datei.bin','xxxx','G:\Mein Ordner',SW_SHOW); |
Funktioniert.
Delphi-Quelltext 1:
| ShellExecute(Application.Handle,'open','datei.exe','xxxx','G:\Mein Ordner',SW_SHOW); |
Aber leider kann ich nichts daran ändern. meine ausgangs datei sit eine .bin datei. wenn ich sie in .exe umbenenne würde es gehen, aber das kommt nicht in Frage, ich brauche einen weg um die .bin datei mit einem parameter zu starten.
Oder aus einer CMD heraus, aber ob ich /c oder /k verwende, die cmd bleibt nach dem ausführen geöffnet (unschön)
Funktioniert, aber CMD bleibt geöfnet. (ic hweis leider nicht wie man noch einen schliesbefehl drannehaengt. denn ich glaube aber es wird gar nicht so weit laufen)
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| ShellExecute(0, Nil, 'cmd', '/c datei.bin xxxx', NIL, SW_Show) |
Also..weis nicht ob es moeglich ist das delphi die .bin datei nimmt und sie asl .exe oeffnen kann.
möglichst ohne temp. zwischenspeichern umbennen und starten etc.
Es sollte möglichst keine zusätzlichen daten erstellen/ablegen.
Sollte alles im Programm ablaufen.
Vielen dank.
-noth
Moderiert von Narses: Highlight- durch Delphi-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 08.10.08 01:48
Wie wäre es mit "/c start datei.bin" als Parameter für die cmd.exe, dies sollte bewirken, dass - trotzdem das Programm noch läuft - der cmd Befehl zurückkehrt und das cmd-Fenster also geschlossen wird.
Übrigens solltest du im Forum statt [highlight] lieber <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG4a1dc2b939c5aac1a55702192fe47ca1}</span></span> schreiben  .
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 08.10.08 10:15
Mit Shellexecute wir die übergebene Datei mit dem zugehörig verknüpften Programm geöffnet. Für Dateien mit der Endung exe ist dies der Explorer bzw. der Loader, der sie dann startet. Mit der Endung bin ist dann wohl kein sinnvolles Programm verknüpft.
Versuch den Prozess mit CREATEPROCESS zu erzeugen.
|
|
Nothilvien 
      
Beiträge: 19
|
Verfasst: Mi 08.10.08 19:26
@jaenicke
Funktioniert super =) dank hide, sieht man das cmd fenster nicht, und nachdem die anwendung gestartet ist, schliest sich das cmd. (zuvor blied das cmd.exe im taskmanager aktiv & beim 2. mal ausführen kamm ein 2. cmd prozess dazu)
Also 1a ;D
Delphi-Quelltext
@Luckie
Ich habe mir diese funktion aus einer beispiel seite abgekupfert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function RunProcess(FileName: string): Boolean; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); FillChar(ProcessInfo, SizeOf(ProcessInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; StartupInfo.wShowWindow := SW_SHOW; result := CreateProcess(nil, @Filename[1], nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); end; |
damit rufe ich die .bin datei auf:
Delphi-Quelltext 1:
| RunProcess('datei.bin xxx.xxx.xxx.xxx xxxx 1 1') |
Es funktiniert, nur leider habe ich noch garkeine erfahrungen mit create process gemacht, daher bin ich nicht im bilde ob das oben audgeführte "sauber" ist bzw, denke ich schon das create process schneller/schoener sein kann als shell execute. jedoch zweifele ich irgendwie an der art in der ich es verwende. bzw. gibt es nicht irgendwo eine andere stelle wo ich das parameter übergeben kann? oder eine bessere methode createprozess zu nutzen.
naja soviel dazu. Aber beide varianten haben optisch den gleichen effekt und funktionieren, supi danke =)!
(p.s. es soll ein spiel direkt gestartet werden der parameter ist die server ip, und da das spiel standart. eine *.bin datei hat, möchte ich da nicht rumfuschen.
also besten dank
-noth
(ich fand die befehle nicht um delphi code darzustellen beim posten, da kamm mir highlight recht in ordnung vor *gg*)
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 08.10.08 19:37
CreateProcess via der von dir geposteten Funktion ist sicher die bessere und saubere Lösung.
Du solltest dir am besten auch mal die Dokumentation anschauen und wie es benutzt wird in RunProcess  , um die Funktion genau zu verstehen. Der Link zur Dokumentation bzw. zur Suche danach (wo es dann der erste Link ist) wurde ja bereits gepostet.
|
|
Nothilvien 
      
Beiträge: 19
|
Verfasst: So 09.11.08 02:47
neues problem:
Also, ich denke diesesmal komme ich nicht herum, meine .bin datei in eine .exe umzubennenen,
es handelt sich um eine andere .bin datei (die sachen wie oben erklaert wurden, funktionieren super ;D nur jetzt habe ich probleme mit einer anderen...)
Aaaalso
wen ich z.b.
Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', 'mini.exe', nil, nil, SW_SHOW); |
aufrufe und sich mein programm im selben verzeichnis, wie "mini.exe" befindet, leuft alles super,
aber sobald ich
Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', 'C:\einordner\mini.exe', nil, nil, SW_SHOW); |
aufrufe funktioniert es nicht ;(
"Runtime Error!
C:\einordner\mini.exe
This application has reqeusted the runtime t terminate in an unusual way..
ich glaube die .exe datei muss geladen werden, sodass sie ausgefuehrt wird als waere sie im ordner, sprich die .exe denkt wenn ich sie mit "C:\einordner\mini.exe" aufrufe, das sie im selben verzeichnis ist wie mein programm. und dort fehlen ihr halt komponenten..mh
mit
Delphi-Quelltext 1:
| Winexec('C:\einordner\mini.exe', SW_SHOWNORMAL) |
funktioniert es 1a... nur sobald ich die string variable anstelle von dem pfad dort eingebe meckert er was von "Inkompitable typen 'string' und 'PAnsiChar' "
naja..auch wenn ich
Delphi-Quelltext 1:
| Winexec(Pchar(mystring), SW_SHOWNORMAL) |
dan meint er "Inkompitable typen'Char' und 'AnsiChar'"
ich benutze borland, in vielen beispielen wurde gezeigt das es so gehen soll, tuts aber nicht ;C
und ich habe auch gegoogelt ala "string convert PAnsiChar" nja..nichts gefunden ;S
und zuletzt mit create process (wie oben gepostet) bekomme ich auch den runtime error.
also waere dankbar fuer jede hilfe!
-noth
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.11.08 03:15
Nothilvien hat folgendes geschrieben : | Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', 'C:\einordner\mini.exe', nil, nil, SW_SHOW); | [...]
ich glaube die .exe datei muss geladen werden, sodass sie ausgefuehrt wird als waere sie im ordner, sprich die .exe denkt wenn ich sie mit "C:\einordner\mini.exe" aufrufe, das sie im selben verzeichnis ist wie mein programm. und dort fehlen ihr halt komponenten..mh |
Und warum schreibst du dann dort nicht den Pfad hin? Stattdessen schreibst du als Ordner, der für das Programm das Arbeitsverzeichnis sein soll, nil...
msdn.microsoft.com/e...ibrary/bb762153.aspx
|
|
Nothilvien 
      
Beiträge: 19
|
Verfasst: So 09.11.08 05:03
o_O;
Ich war mir dessen parameter nicht bewusst.
Aber dank deiner mühe weis ichs nun, zudem werde ich demnaechst auch erst in der msdn nachsehen bevor ich wieder voreilig etwas poste^^"
tut mir leid, aber nächstes mal weis ich bescheid ^.^
danke~ mein held *.*
klappt nun wunderbar =)
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.11.08 06:26
Das selbe gilt im übrigen auch für CreateProcess, also das Umbenennen sollte auch nicht nötig sein  .
Du hast oben ja gepostet, dort hast du auch kein Verzeichnis angegeben: Nothilvien hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function RunProcess(FileName: string): Boolean; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); FillChar(ProcessInfo, SizeOf(ProcessInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; StartupInfo.wShowWindow := SW_SHOW; result := CreateProcess(nil, @Filename[1], nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); end; | |
Du könntest einfach ExtractFilePath benutzen um den Pfad der Datei dort anzugeben.
|
|
Nothilvien 
      
Beiträge: 19
|
Verfasst: So 09.11.08 09:01
ja ich denke ich habe es verstanden, ich habe mich auch bei create process nochmal umgeschaut,
und es istganz gut o.o!
ich kann mit CreateProcess beide .bin datein ohne probleme aufrufen, auch wen meine .exe in einem foellig anderem ordner ist.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function ExecuteBin(sExecutableFilePath,sExecutableDirPath : string ): string; var pi: TProcessInformation; si: TStartupInfo; begin FillMemory( @si, sizeof( si ), 0 ); si.cb := sizeof( si );
CreateProcess(nil,PChar(sExecutableFilePath ),Nil, Nil, False,NORMAL_PRIORITY_CLASS, Nil, PChar(sExecutableDirPath),si, pi );
CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); end; |
Delphi-Quelltext 1:
| ExecuteBin(Startup,path); |
ja das habe ich dan auch herausbekommen, und zudem habe ich noch bischen im netz geschaut und mehrer beispiele angescahut und mir somit etwas zusammen gebastelt, was perfekt fuer mich passt und es so umgeschrieben das die funktion auch den pfad uebergeben kann ^.^!
danke dir
ich frage mich ob es auch noch moeglich ist, die "bin" datei mit Applocale zu laden?
Das parameter wenn man eine verknuepfng erstellt schaut wie folgt aus:
C:\Windows\AppPatch\AppLoc.exe "C:\ordner\app.exe" "/L0804"
aber wenn ich es in app.bin umaendere geht es natuerlich mal wieder nicht =(
Denke mal da Applocale das halt nicht als executable interpretiert.
naja aber wenn man nun mein programm mit AppLocale lead, und dan die .bin mit meinem programm aufruft, so wird sie auch richtig dargestellt (vorher mit dem konsolenaufruf per shellexecute ging das nicht)
ich denke mal weil der prozess aus meiner exe heraus erstellt wird.
Das sit jedenfalls schonmal viel wert ^-^!
Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', 'AppLoc.exe', '"G:\ordner\bin.exe" "xxx.xxx.xxx.xxx xxxxx 1 1" "/L0804"', 'C:\Windows\AppPatch\', SW_SHOW); |
so jedenfalls kann ich meine anwendung direkt mit AppLocale Starten, jedoch funktionietr das nur bei .exe datein, sobald ich .bin nehme started applocale ganz normal und fragt mich ob ich etwas neues einrichten mag.
Wo ich es doch jetzt schon soe schoen geschaft habe beide bin datein so schoen aufzurufen^^
frage mich ob dies auch mit Create Process meoglich ist?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, = 'C:\Windows\AppPatch\Apploc.exe' __inout_opt LPTSTR lpCommandLine, = '"G:\ordner\bin.exe" "xxx.xxx.xxx.xxx xxxxx 1 1" "/L0804"' __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, = 'C:\Windows\AppPatch\' __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation ); |
muesste doch theoretisch so aufgebaut sein?
lpCommandLine specifies the command line. The new process can use GetCommandLine to retrieve the entire command line.
muss ich da noch etwas machen damit er die ausfuehrt o...o?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function ExecuteBin(sAppname,sCommand,sCurDir: string ): string; var pi: TProcessInformation; si: TStartupInfo; begin FillMemory( @si, sizeof( si ), 0 ); si.cb := sizeof( si );
CreateProcess(pChar(sAppname),PChar(sCommand),Nil, Nil, False,NORMAL_PRIORITY_CLASS, Nil, PChar(sCurDir),si, pi );
CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); end; |
Delphi-Quelltext 1:
| ExecuteBin('C:\Windows\AppPatch\Apploc.exe','"G:\ordner\bin.exe" "xxx.xxx.xxx.xxx xxxxx 1 1" "/L0804"','C:\Windows\AppPatch\'); |
jedenfallsstartet erso applocale nur als ob ich es doppelt klcken wuerde (parameter werden ignoriert) aber auch wen ich sie direkt hinter C:\Windows\AppPatch\Apploc.exe angeb, dan start es agr nicht :S
nja aber ich bin dir schon sehr dankbar fuer die unterstützung ich meine es geht ja auch wen man mein programm nun mit applocale startet =)!!!
jedoch waere es auch nice die funktion im programm zu haben^^
=) also ich bin volkommen zufrienden!
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.11.08 14:06
Probier mal den ersten Parameter auf nil zu setzen und die komplette Kommandozeile in den zweiten zu setzen.
Nothilvien hat folgendes geschrieben : | lpCommandLine specifies the command line. The new process can use GetCommandLine to retrieve the entire command line.
muss ich da noch etwas machen damit er die ausfuehrt o...o? |
Nein, GetCommandLine ist eine Funktion, die die ausführte Kommandozeile dem ausgeführten Programm mitteilt.
Das heißt wenn du ein Programm mit einer hier angegebenen Kommandozeile aufrufst, dann kann dieses wiederum die Funktion benutzen um diese (komplett inkl. der Parameter etc.) auszulesen.
|
|
Nothilvien 
      
Beiträge: 19
|
Verfasst: Mo 10.11.08 14:55
Delphi-Quelltext 1:
| ExecuteBin('C:\Windows\AppPatch\Apploc.exe','C:\Windows\AppPatch\Apploc.exe "G:\ordner\datei.exe" "Parameter" "/L0804"','C:\Windows\AppPatch\'); |
"/L0804" ist die Sprache in der das programm laufen soll
"Parameter" Sind Startparemeter der exe
ich musste nur "C:\Windows\AppPatch\Apploc.exe" noch das auch vor die parameter setzen, dan hats geklappt =)!
aber es geht halt nur mit .exe .com etc was windwos halt als application kennt,
wenn ich ihm eine ".bin" gebe, geht es nicht, da der Prozess ja nun ueber Applocale gesatartet wird und nicht ueber mein programm.
aber das geht schon in ordnung, lasse ich halt eine kopie der bin- datei als exe erstellen.
^-^
sollte schon hinhauen.
p.s. das funktioniert bei vista aber nur wenn man delphi oder halt das programm als administrator ausgeführt! wird.
vielen dank dir jean für die hilfe ^-^
evtl kann ich mich ja iwan mal revangieren.
bye~
|
|
|