C++ Programm schreibt in eine .exe



  • Hi C++ Community,
    Ich programmiere schon einige Zeit an einen Programm, das Dateien aus einer anderen EXE aufnimmt.

    Es soll so funktionieren:
    Es gibt zwei EXEn. Die 1 EXE wird geöffnet, man gibt Werte ein (Zahlen oder so) und die werden dann in die andere EXE geschrieben, so dass die 2. EXE beim Start die eingegebenen Werte ausgibt.

    Ich glaub die 2. exe muss man Binär öffnen (ios::binary)?!

    Bitte um Hilfe
    Vorschläge oder Tutorial Links wären nett, auf Google findet man nix

    Vielen Danke für jede sinnvolle Antwort

    MfG Whata :xmas1:



  • Und wieso dieses Gedöhns? Benutz doch einfach eine Datei als Kommunikationsschicht, welche du mit dem einen Programm befüllst und mit dem anderen ausliest (was C++ von Haus aus anbieten würde). Alternativ ginge das auch über Shared Memory bzw. auch Sockets und und und, ist auf jeden Fall dann schon plattformabhängig. Aber das Binary direkt zu bearbeiten... naja...



  • Ich programmiere schon einige Zeit an einen Programm, das Dateien aus einer anderen EXE aufnimmt.

    Daten oder Dateien? Und von welcher Dateigröße sprechen wir hier?

    Sowas macht man durch Interprozesskommunikation. Das heisst, du mappst deine Datenstruktur auf eine page (á 2048 KB groß) und stellst es dem anderen Programm/Prozess zur Verfügung. Das ist mit Boost::Interprocess wirklich mehr als einfach.

    Wie Aktenordner schon sagte, könnte man auch eine Datei benutzen, jedoch kann ich mir vorstellen, dass das _zu lange_ dauern kann.

    Falls sich deine Transferierungsoperationen an einer Hand abzählen lassen, kannst du auch einfach direkt auf den Speicher des Prozesses zugreifen. Windows stellt da Funktionen wie ReadProcessMemory() (wenn ich mich nicht täusche) zur Verfügung.



  • Erstmal danke für die Antworten

    So, hab mir mal die WriteProcessMemory und ReadProcessMemory angeguckt und werde mich wahrscheinlich dafür entscheiden. Bin mir aber nicht sicher.

    Es sollt so funktionieren:
    Ich öffne das 1. Programm und gebe Werte ein. So diese Werte werden jetzt in das 2. Programm geschrieben (also speichert es dort) und wenn ich jetzt das 2. Programm starte wird mir dieser Wert wieder ausgegeben (er ist ja in der Exe gespeichert). So meine ich das.

    Danke



  • Sry wenn ich mich täusche, aber wenn du das in den Arbeitsspeicher schreibst mit WriteProcessMemory ist das aber nicht dauerhaft in der EXE...



  • [MOP] schrieb:

    wenn du das in den Arbeitsspeicher schreibst mit WriteProcessMemory ist das aber nicht dauerhaft in der EXE...

    In der Executable steht es sowieso nicht, sondern im Arbeitsspeicher (RAM) 😉

    @Whata
    Ähhh... ? Also, mach es einfach so:
    Programm 1 starten => "Werte" definieren => Speicheradresse (per &-Operator) auslesen => in die Zwischenablage kopieren => in Programm 2 den Wert sizeof(Datentyp von Programm 1 von Werte) ab Speicheradresse einlesen => Fertig!

    Nebenbei; Programm 1 muss zuerst gestartet werden und solange weiterlaufen, bis der Speicherbereich ausgelesen wurde, sollte aber klar sein^^



  • Mir ist gar nicht aufgefallen, das hier noch so viele Unwahrheiten stehen.

    Whata schrieb:

    So diese Werte werden jetzt in das 2. Programm geschrieben (also speichert es dort)

    Einfach in den Speicherbereich eines anderen Prozesses schreiben, geht nur bedingt. Bzw. nur dann, wenn du die Rechte besitzt. Und das ist oftmals nicht so.

    Whata schrieb:

    (er ist ja in der Exe gespeichert)

    Nein, im Arbeitsspeicher (RAM).

    Whata schrieb:

    ... hab mir mal die WriteProcessMemory... angeguckt...

    WriteProcessMemory brauchst du nicht mal. Einfach eine Instanz erzeugen.

    Aber wie gesagt; Nutze lieber Boost::Interprocess. Der Vorteil für dich ist, das die belegten pages bestehen bleiben (auch nach Beendigung des Programmes, jedenfalls wenn du den Speicher nicht bewusst wieder freigibst). Und was auch noch geht: Du kannst danach "suchen" 🤡. Und was auch noch toll ist: Du legst selber die Zugriffsrechte fest 🙂 .

    So, entschuldigt mich wegen des wieder rauskrempelns des Threads 😃


Anmelden zum Antworten