Seite 1 von 2

Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 13.05.2010 18:10
von ts-soft
Da hier wiederholt nach solch einem Code gefragt wurde, hab ich mal eine einfache
Beispielanwendung geschrieben. Das Paket kann hier:
http://www.realsource.de/tmp/Text2Exe.zip gedownloadet werden.

Die Beispielanwendung hängt eine beliebige Textdatei an die Exe (stubs), welche den
Text dann per Doppelklick im eigenem EditorGadget darstellt.
Das Beispiel läßt sich natürlich beliebig ausbauen, z.B. verschlüsselte Texte, gepackte Dateien,
usw. ...

Die simple stubs:

Code: Alles auswählen

EnableExplicit

Define FF, length.q, *mem, Text.s

FF = ReadFile(#PB_Any, ProgramFilename())

If FF
  FileSeek(FF, Lof(FF) - SizeOf(Quad)) ; am Ende die länge des Angehängten lesen
  length = ReadQuad(FF)
  FileSeek(FF, Lof(FF) - SizeOf(Quad) - length) ; zum start des Angehängten
  If length
    *mem = AllocateMemory(length)
    If *mem
      ReadData(FF, *mem, length) ; Angehängtes in den Speicher
    EndIf
  EndIf
  CloseFile(FF)
  
  If *mem
    Text = PeekS(*mem)
    FreeMemory(*mem)
  EndIf
  
  
  OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "Text2Exe", #PB_Window_SystemMenu)
  EditorGadget(0, 5, 5, 630, 470, #PB_Editor_ReadOnly)
  SetGadgetText(0, Text)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  
EndIf
Das Erzeugerprogramm:

Code: Alles auswählen

EnableExplicit

DataSection
  stubs:
  IncludeBinary "stubs\stubs.exe"
  stubs_end:
EndDataSection

Define.s TextFile, ExeFile
Define FF, *mem, length

TextFile = OpenFileRequester("Bitte Textdatei wählen:", "readme.txt", "Text (*.txt)|*.txt", 0)
If TextFile
  FF = ReadFile(#PB_Any, TextFile)
  If FF
    length = Lof(FF)
    *mem = AllocateMemory(length)
    If *mem
      ReadData(FF, *mem, length)
    EndIf
    CloseFile(FF)
  EndIf
  
  ExeFile = SaveFileRequester("Bitte Ausgabedatei wählen:", "readme.exe", "Exe (*.exe)|*.exe", 0)
  
  If ExeFile
    FF = CreateFile(#PB_Any, ExeFile)
    If FF
      WriteData(FF, ?stubs, ?stubs_end - ?stubs)
      WriteData(FF, *mem, length)
      WriteQuad(FF, length)
      CloseFile(FF)
      
      RunProgram(ExeFile)
    EndIf
  EndIf
EndIf
Dieses Beispiel ist Public Domain, also macht, ändert, was immer ihr möchtet damit.

Gruß
Thomas

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 19.07.2010 14:12
von Delle
Geht das auch mit mehreren Dateien? Also z.B. einer .exe und einer .txt-Datei?

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 19.07.2010 14:48
von NicTheQuick
Klar, du hängst einfach beide Dateien zusammen mit ihrer Größe in Bytes an und dann nochmal ein Quad mit der Größe von beiden zusammen.

Beispiel: 2 Dateien, erste mit 100 Bytes, zweite mit 20 Bytes:

Code: Alles auswählen

WriteQuad(FF, 100)
WriteData(FF, *memDatei1, 100)
WriteQuad(FF, 20)
WriteData(FF, *memDatei2, 20)
WriteQuad(FF, 100 + 20 + 2 * SizeOf(Quad))
Auslesen ca. so:

Code: Alles auswählen

FileSeek(FF, Lof(FF) - SizeOf(Quad))
wholeLength.q = ReadQuad(FF)
FileSeek(FF, Lof(FF) - SizeOf(Quad) - wholeLength)
If wholeLength
  length1.q = ReadQuad(FF)
  If length1
    *memDatei1 = AllocateMemory(length1)
    If *memDatei1
      ReadData(FF, *memDatei1, length1)
    EndIf
  EndIf
  ;das selbe für Datei2 mit length2, *memDatei2
EndIf
;jetzt stehen beide angehängten Dateien in *memDatei1 und *memDatei2.
Somit sollte klar sein, dass das auch mit beliebig vielen Dateien geht. Dazu könnte man aber auch gleich die PB-Datei-Container bzw. -Packer verwenden.

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 19.07.2010 15:06
von Vera
:allright: DANKE :)

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 23.12.2016 17:34
von Lord
Hallo!

Entschuldigung wenn ich diesen Uraltbeitrag ausgrabe, aber
das Beispiel von ts-soft paßt genau zu dem Verfahren, daß
ich bei meinem Programm ebenfalls anwende.
Dieses hat auch mehrere Jahre (3?) problemlos funktioniert.
Jetzt ist aber der Fall eingetreten, daß bei einem Nutzer mei-
nes Programmes das Verfahren zum Auslesen des an das Pro-
gramm angehängten Teils einfach nicht funktionieren will.
Ich habe festgestellt, daß bei ihm das Öffnen der Datei zum
Lesen immer "0" zurückgibt. Nachdem es mit meinem Programm
nicht funktioniert hat, habe ich im Forum gesucht und das
obige Beispiel gefunden, kompiliert und dem User geschickt.
Auch hiermit tritt das gleiche Phänomen auf. Die Datei läßt
sich nicht zum Lesen öffnen. ReadFile() liefert immer "0".

Der Nutzer hat ein System mit Win7 x64. Das genutzte AV-
Programm wurde abgeschaltet, die Sicherheitseinstellungen
geändert, Programm als Admin und als User ausgeführt.
Das Programm wird nicht aus dem Ordner "Program Files"
heraus ausgeführt. Alles bringt keinen Erfolg.

Dieses Programm und mehrere andere Programme, bei denen
ich ebenfalls einen Anhang verwende, bereiten bei dutzenden
anderen Usern kein Problem.

Hat einer noch eine Idee, warum das bei diesem einen User
nicht funktionieren könnte?
kein Erfolg.

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 25.12.2016 01:21
von udg
hab das mal getestet. es läuft hier:
win7 64 bit

jedoch wird der zeichensatz nicht immer richtig interpretiert. trotz unicode oder ascii hängt es mir hinten hin und wieder ein "Ä" dran
nicht immer wohlgemerkt

aber gehen tuts.
man kann solche sachen (anzeigen einer Text Message beim starten einer exe) aber auch anders machen.

grüße

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 25.12.2016 11:45
von Lord
Danke für die Antwort.

Es geht hier aber nicht um Alternativen und es wird und soll auch kein Text angezeigt werden.

Es geht hier um die Frage, warum es bei einem Nutzer nicht funktioniert, während es bei mehreren Dutzend anderen Nutzern anstandslos funktioniert.

Welche Besonderheit am System eines Nutzers kann das Funktionieren des obigen (und meines) Codes verhindern?
Es ist definitiv so, daß bei ihm "ReadFile(#PB_Any, ProgramFilename())" immer "0" zurück gibt.

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 25.12.2016 13:21
von man-in-black
Hi,

kannst du dir nicht die error codes ausgeben lassen?
Ansonsten pack mal programfilename() in ne extra Zeile.

Mfg
MIB

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 25.12.2016 13:28
von Sicro
Möglicherweise hat der Nutzer die Rechte bei dem Programm so stark eingeschränkt, dass nur das Ausführen, aber nicht das Lesen erlaubt ist.
Mit den Gruppenrichtlinien kenne ich mich nicht aus, aber da lässt sich sicherlich einstellen, dass EXE-Dateien nur Rechte zum Ausführen bekommen.

Hast du es mal mit dem Flag "#PB_File_SharedRead" bei ReadFile() ausprobiert?
Ich denke eher weniger, dass das was bringt, aber versuchen kann man es ja mal.
Wenn er bei der Programmdatei aber nur Ausführrechte hat, funktioniert dies natürlich auch nicht.

Re: Dateien an Exe hängen Beispiel Text2Exe

Verfasst: 26.12.2016 11:16
von Lord
man-in-black hat geschrieben:...
Ansonsten pack mal programfilename() in ne extra Zeile.
...
Im Originalprogramm hat der Befehl eine eigene Zeile.
Im obigen Beispiel nützt das aber auch nichts.
Sicro hat geschrieben:Möglicherweise hat der Nutzer die Rechte bei dem Programm so stark eingeschränkt, dass nur das Ausführen, aber nicht das Lesen erlaubt ist.
Mit den Gruppenrichtlinien kenne ich mich nicht aus, aber da lässt sich sicherlich einstellen, dass EXE-Dateien nur Rechte zum Ausführen bekommen.

Hast du es mal mit dem Flag "#PB_File_SharedRead" bei ReadFile() ausprobiert?
Ich denke eher weniger, dass das was bringt, aber versuchen kann man es ja mal.
Wenn er bei der Programmdatei aber nur Ausführrechte hat, funktioniert dies natürlich auch nicht.
Ich habe de Nutzer nochmal angemailt, er soll mir alle Anzeigen
aus den Eigenschaften/Sicherheit/Berechtigungen schicken.
Ich warte da noch auf Antwort.

Mit dem #PB_SharedRead habe ich es noch nicht probiert. Werde ich
dann mal ein weiteres Testprogramm an den Nutzer schicken.
Bin gespannt, was da an Antwort kommt.

Danke an alle für die Denkanstöße!
Weiterhin noch ein Frohes Fest.