ShellExecute vs exec*
-
hi,
in meinem programm liegt in einem extra ordner dateien mit dem dateityp .xyz.
diese sind aber in wirklichkeit exen. wenn ich das programm im gesamten compilieren würde, wäre die exe leider bis zu 8MB gross. einzeln ist es zwar noch grösser aber dafür schneller. eventuell kennt wer auch eine möglichkeit es "anders" und kleiner zu compilieren (exe packen mit hilfe von aspack mache ich schon)zurück zum thema..
wenn ich:
=> ShellExecute(Handle, "open", "prog1.xyz", NULL, NULL, SW_SHOWNORMAL);
da passiert leider garnichtswenn ich:
=> execl("prog1.xyz", "prog1.xyz", "", NULL);
dann startet er zwar diese "exe" aber beendet auch das aktuelle programm.
das soll aber nichtkann wer einem anfänger den fehler sagen?
-
Hallo
statt einige "exen" zu verwenden bietet sich hier dióch eher an DLLs zu verwenden
MfG
Klaus
-
also ich habe den cbuilder5. mit dlls kenne ich mich noch nicht so aus, ausser vom hören sagen. ich dachte dort kommen nur funktionen und sowas rein. gehen da auch ganze vcl anwendungen?
gibt es da ein einfaches beispiel für einen anfänger wie man dll statt exe erstellt und dann auch startet? t'schuldigung für bestimmt so simple fragen
*in ecke versteck*
-
boomer schrieb:
ich dachte dort kommen nur funktionen und sowas rein. gehen da auch ganze vcl anwendungen?
Du kannst dort auch Forms mit der dazugehörigen Funktionalität ablegen. Allerdings agieren die dann als Bestandteil des Programmes, nicht eigenständig.
Was für eine Funktion haben deine externen "Module" denn, was macht deine Anwendung generell?
-
Jansen schrieb:
Allerdings agieren die dann als Bestandteil des Programmes, nicht eigenständig.
sorry das verstehe ich nicht~
inwiefern verhält sie sich dann "anders"?
also dll muss nicht, mir üwrde reichen wenn ich weiss wie man .xyz als exe startet. geht ja nur leider beendet sich das aufrufende programm dabei auch.alle diese "Module" greifen auf die selben datendateien und lesen und schreiben aus/in diese. manche malen in einem TImage etwas daraus dar und andere füllen damit nur TEdit oder TLabel's. da ich diverse komponentenpacks nutze werden die exen dementsprechend gross
allerdings soll ja immer nur ein "Modul" aktiv sein können.
habe das bisher alles als echte exen noch rumliegen und momentan stört es das ich so mehrere fenster offen habe. ich wähle im menü ein exe aus und muss dann immernoch diese manuell schliessen, sonst häufen sich die fenster wie wild
-
ShellExecute(0,"open","prog1.xyz",0,0,SW_SHOWDEFAULT);
geht bei mir einwandfrei
-
also ich habe das 1:1 bei mir eingespielt und es passiert garnichts.
die execl arbeitet. das verstehe ich nun garnicht das dies bei dir gehen soll.
es gibt ja rückgabewerte der funktion. wie gebe ich diese aus?
beispiel ERROR_BAD_FORMAT
-
okok.. Probieren wir mal was!
Starte ein neues Projekt.
Plaziere einen Button drauf und geh in das Event OnClick davon!
Füge dort:ShellExecute(0,"open","main.cpp",0,0,SW_SHOWDEFAULT);
ein!
Speichere die unit als main und das projekt als irgendwas!
Kompilier!
Drück auf den Button!
Jetzt müsstest du main.cpp (also die src vom projekt) öffnen! So isses bei mir!Und öffnet sich die main.cpp?
[edit] wenns nich geht dann includier mal die shellapi.h!
Glaub ich aber net, dass es daran liegt
-
ja ne das problem ist ja folgendes
shellexecute startet das programm womit der dateityp verbunden ist.
bei txt wird es also notepad sein und bei doc word.
aber xyz ist kein bekannter dateityp also wird kein entsprechendes programm gestartet. anders gesagt shellexecute ist wie der doppelklick, nur das kein "öffnen mit" dialog erscheint wenn dateityp unbekannt ist.ich brauch was wie execl() was aber das sich selbst nicht beendet.
-
Könnte sein, das Windows da manschmal nachhilfe braucht
Systemsteuerung -> System -> Erweitert -> Umgebungsvariablen -> Systemvariablen
Da die Variable PATHEXT.
Dort einfach .xyz eintraten und vielleicht geht es.Wenns klappt, musste dann nur noch ins Programm einbauen, das es automatisch gesetzt wird und fertig
Das ändern machst du mit SETSET PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.xyz
ACHTUNG: solltest vorher mit
SET PATHEXT
die aktuellen Einstellungen holen und mitübernehmen
Also is kein Garantiertes mittel aber versuch das einfach mal aus
NebeninfO: Eigentlich sorge die Variable nur dafür, das Datein mit den angegebenen endungen in der Shell nicht mit Erweiterung aufgerufen werden müssen...
Aber wer weis vielleicht funktioniert es dann...
Bei mir definitiv schon....
Oups bei gehts auch ohne den Eintrag...
Egal versuch mach klugAch ja.. ich habe es direkt in der Shell versucht... Und ich habe bestimmt keine erweiterung xyz registiert
Is schon was anders ls Doppelklick.
-
also in cmd kann man text.xyz aufrufen.
wenn ich test.xyz in test.exe umbenenne dann macht es shellexecute .. heisst sie wieder test.xyz passiert nix.
also egal was ihr da macht, auf jedenfall ruft shellexecute nicht diese umbenannte exe auf.
-
es weiss keiner wie das nun geht?
-
Lösung:
WinExec('test,xyz', SW_SHOWNORMAL);
-
Wollte ich dir auch grad vorschlagen.
Trotzdem nochmal der Hinweis, dass der ganze Ansatz mit den einzelnen Exes "suboptimal" ist.
Bei Gelegenheit solltest du dich mal ernsthaft mit der Modularisierung per DLL beschäftigen.
-
hmm ich habs probiert hat nicht funktioniert ...
hab auch path gesetzt aber vielleicht braucht windows dazu ein reboot wie auch immer, keine akzeptable lösung
WinExec(ClientInfo1.ClientName.c_str(), SW_SHOWNORMAL); geht dagegen suppa
danke ^^