Exe aus purebasic heraus
Exe aus purebasic heraus
weiß jemand ob es mit purebasic möglich ist z.b. ein programm zu schreiben welches eine gallery aus ausgesuchten bilder erstellt und alles in eine exe datei packt!
d.h. ich will das man dann nur diese exe hat!
und keine bilder extra oder als dll
sowas wie eine art diashow oder geht sowas mit pb nicht!
d.h. ich will das man dann nur diese exe hat!
und keine bilder extra oder als dll
sowas wie eine art diashow oder geht sowas mit pb nicht!
purebasic 3.93
mhhh... wird jetz viel zum schreiben. Zumal ich tot müde bin (kann mich nicht daran errinern, gestern oder heute geschlafen zu haben
)
Also. mal ne Aufteilung:
Programm A: Dein Galeriemaker
Programm B: Eigenständige Galerie.
Als erstes brauchst du ein anständiges Archiv system. Du kannst natürlich die PB paket funktionen verwenden, aber das wird anschließend etwas schwer für Programm B zu lesen. Am bessten wäre es ein eigenes Archiv system zu überlegen.
Programm A schreibt in eine Datei eine Struktur mit dem "Head". Im Head stehten informationen wie signatur (um die richtigkeit des archivs sicher zu stellen), Galeriename, Anzahl der Elemente, Offset der Dateidaten und Offset der Dateien selbst.
Das Archiv wäre dann so gegliedert:
Hier ein bischen Code:
Head:
So. Programm A komprimiert zuerst alle Dateien, Füllt den HEader und schreibt ihn in die Datei, Füllt alle FileNodes und schreibt diese ebenfalls in die Datei. Danach kommt dann der Daten rest. Wenn die Datei nun fertig vorliegt, kann Programm A Programm B aus den resourcen oder sonst wo entpacken und das erzeugte Archiv hinten an Programm B anhängen. Zusetzlich wird noch ganz am Ende geschrieben, wo das Archiv in der Exe anfängt.
Programm B liest dann die lezten 4 Bytes (long) aus um den Offset des Archivs in der exe zu ermitteln. Programm B läd dann das Archiv in einen allocierten memory bereich und beginnt mit dem auspacken des archivs in den verwaltbaren daten bereich. Wenn dies nun endlich geschehen ist, kann die galerie anfange.
Vielleicht sollte ich für dieses Packsystem eine Userlib machen...
Bitte zereist diese Lösung nicht gleich in der Luft >__<
Also. mal ne Aufteilung:
Programm A: Dein Galeriemaker
Programm B: Eigenständige Galerie.
Als erstes brauchst du ein anständiges Archiv system. Du kannst natürlich die PB paket funktionen verwenden, aber das wird anschließend etwas schwer für Programm B zu lesen. Am bessten wäre es ein eigenes Archiv system zu überlegen.
Programm A schreibt in eine Datei eine Struktur mit dem "Head". Im Head stehten informationen wie signatur (um die richtigkeit des archivs sicher zu stellen), Galeriename, Anzahl der Elemente, Offset der Dateidaten und Offset der Dateien selbst.
Das Archiv wäre dann so gegliedert:
Code: Alles auswählen
[Head]
[Elemente]
[Dateien]Head:
Code: Alles auswählen
strucutre sHead
hedSignatur[8].b ; Beliebige 8 Byte lange Signatur. Kann länger sein
hedGalerieName[255].b ; 255 Byte langer name der Galerie.
hedFileCount.l ; Anzahl der Dateien im Element bereich
hedFileOffset.l ; Offset zu den Daten für die Dateien
hedDataOffset.l ; Offset zu den Dateien selbst
endstructure
structure sFileNode
fndDateiPos.l ; Position der Datei n der Galerie
fndOffset.l ; Start der Datei im Data Bereich
fndSize.l ; Größe der Datei im Data Bereich
fndCompresion.l ; Kompressions stärke
endstructureProgramm B liest dann die lezten 4 Bytes (long) aus um den Offset des Archivs in der exe zu ermitteln. Programm B läd dann das Archiv in einen allocierten memory bereich und beginnt mit dem auspacken des archivs in den verwaltbaren daten bereich. Wenn dies nun endlich geschehen ist, kann die galerie anfange.
Vielleicht sollte ich für dieses Packsystem eine Userlib machen...
Bitte zereist diese Lösung nicht gleich in der Luft >__<
Es geht auch einfacher: Mischa hat mal ein Prog gepostet das Daten in sich selbst schreibt. Ich hab damit z.B. mal einen SFXer gebaut für Rars. Mann baut sich einfach nen passendes Prog das die Binarys in die SFX Vorlagen EXE (die man vorher baut, diese liest die Daten aus sich selbst.) einbindet mit Trennzeichen und namen... hab den Code leider nimmer sonst würde ich ihn posten. 
Hier hast ein Beispiel für eine EXE die die Daten in sich selbst schreibt ist von Mischa, du musst das für dich nur so abändern das ein Fremd Programm (Galerimaker) die Daten (Galllerie) in das Andere Programm (SFX-Gallerie) schreibt und in dem anderem Programm (SFX-Gallerie) müssen die Daten die vom Fremd Programm (Galerimaker) eingeschrieben wurden eingelesen werden 
Code: Alles auswählen
; www.purearea.net (Sourcecode collection by cnesm)
; Author: Mischa
; Date: 22. November 2003
Procedure.s MainPart(Text.s)
;Simple text-Box
OpenWindow(0,0,0,240,160,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Notes")
CreateGadgetList(WindowID())
StringGadget(0,5,5,230,150,Text,#ES_MULTILINE|#WS_VSCROLL|#WS_HSCROLL|#ES_AUTOHSCROLL|#ES_AUTOVSCROLL)
Repeat:Until WaitWindowEvent() = #PB_EventCloseWindow
ProcedureReturn GetGadgetText(0)
EndProcedure
;Get program and temp-folder name
program.s= Space(1000):GetModuleFileName_(0,program,1000)
temp.s= Space(1000):GetTempPath_(1000,temp)
;Construct Clone-Name
clone.s= temp+"_"+GetFilePart(program)
;Check mode by parameter
mode.s=ProgramParameter()
If mode="clone" ;I am the clone
;Check if another instance is running (cause makes no sense here)
Mutex=CreateMutex_(0,1,"Mischas Notes")
Error=GetLastError_()
If Mutex<>0 And Error=0
program=ProgramParameter()
Size=FileSize(program)
ReadFile(0,program)
FileSeek(Size-12)
If ReadLong() = 1234321 ;this is a sign for us that there are resources inside
Size=ReadLong()
resourcesize=ReadLong()
FileSeek(Size)
*res=AllocateMemory(resourcesize)
ReadData(*res,resourcesize)
resource.s=PeekS(*res)
EndIf
FileSeek(0)
*header=AllocateMemory(Size)
ReadData(*header,Size) ;Put the small main-program in the pocket (alternate do this in the end)
CloseFile(0)
newtext.s=MainPart(resource) ;The main-program
If newtext <> resource ;Ok, now we construct new program with new resources
resourcesize=Len(newtext) + 1
*res=AllocateMemory(resourcesize)
PokeS(*res,newtext)
SetFileAttributes_(program,#FILE_ATTRIBUTE_NORMAL) ;maybe its write-protected
CreateFile(1,program)
WriteData(*header,Size) ;program-part
WriteData(*res,resourcesize) ;resource-part
WriteLong(1234321) ;Our sign
WriteLong(Size) ;Adress of resources
WriteLong(resourcesize) ;Size of resources
CloseFile(1)
EndIf
RunProgram(program,"killclone","",0)
EndIf
CloseHandle_(Mutex)
ElseIf mode="killclone" ;Delete clone of program
Sleep_(500)
DeleteFile(clone)
Else ;normal mode
;Create and start clone
If FileSize(clone) = -1
CopyFile(program,clone)
EndIf
RunProgram(clone,"clone "+Chr(34)+program+Chr(34),"",0)
EndIf
End
