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 garnichts

    wenn ich:
    => execl("prog1.xyz", "prog1.xyz", "", NULL);
    dann startet er zwar diese "exe" aber beendet auch das aktuelle programm.
    das soll aber nicht 😞

    kann wer einem anfänger den fehler sagen? 🤡


  • Mod

    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 SET

    SET 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 klug 😉

    Ach 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 ^^


Log in to reply