Dateien an Exe hängen Beispiel Text2Exe

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Dateien an Exe hängen Beispiel Text2Exe

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Delle
Beiträge: 1118
Registriert: 10.05.2005 22:48

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag von Delle »

Geht das auch mit mehreren Dateien? Also z.B. einer .exe und einer .txt-Datei?
PB 6.02 LTS + Win 11
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag 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.
Bild
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag von Vera »

:allright: DANKE :)
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag 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.
Bild
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag 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
Zuletzt geändert von udg am 25.12.2016 21:55, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag 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.
Bild
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag von man-in-black »

Hi,

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

Mfg
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Dateien an Exe hängen Beispiel Text2Exe

Beitrag 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.
Bild
Antworten