Autor Beitrag
Nothilvien
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 08.10.08 01:38 
Also mein problem:

Funktioniert nicht
ausblenden Delphi-Quelltext
1:
 ShellExecute(Application.Handle,'open','datei.bin','xxxx'{Parameter},'G:\Mein Ordner',SW_SHOW);					

Funktioniert.
ausblenden Delphi-Quelltext
1:
 ShellExecute(Application.Handle,'open','datei.exe','xxxx'{Parameter},'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)
ausblenden 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 user profile iconNarses: Highlight- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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



BeitragVerfasst: 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 Suche im MSDN CREATEPROCESS zu erzeugen.
Nothilvien Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{ShellExecute(0,
Nil,
'cmd',
'/c start datei.bin xxx.xxx.xxx.xxx xxxx 1 1',
NIL,
SW_Hide);




@Luckie
Ich habe mir diese funktion aus einer beispiel seite abgekupfert:
ausblenden 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], nilnil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nilnil,
    StartupInfo, ProcessInfo);
end;

damit rufe ich die .bin datei auf:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
 ShellExecute(Handle, 'open''mini.exe'nilnil, SW_SHOW);					


aufrufe und sich mein programm im selben verzeichnis, wie "mini.exe" befindet, leuft alles super,
aber sobald ich

ausblenden Delphi-Quelltext
1:
 ShellExecute(Handle, 'open''C:\einordner\mini.exe'nilnil, 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
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.11.08 03:15 
user profile iconNothilvien hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
 ShellExecute(Handle, 'open''C:\einordner\mini.exe'nilnil, 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
user profile iconNothilvien hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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], nilnil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nilnil,
    StartupInfo, ProcessInfo);
end;
Du könntest einfach ExtractFilePath benutzen um den Pfad der Datei dort anzugeben.
Nothilvien Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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.

ausblenden 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 ),NilNil, False,NORMAL_PRIORITY_CLASS, Nil, PChar(sExecutableDirPath),si, pi );

  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );
 end;


ausblenden 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 ^-^!

ausblenden 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?

ausblenden 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?


ausblenden 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),NilNil, False,NORMAL_PRIORITY_CLASS, Nil, PChar(sCurDir),si, pi );

  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );
 end;


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.11.08 14:06 
Probier mal den ersten Parameter auf nil zu setzen und die komplette Kommandozeile in den zweiten zu setzen.

user profile iconNothilvien hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mo 10.11.08 14:55 
ausblenden 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~