Exe aus purebasic heraus

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
romartens
Beiträge: 57
Registriert: 23.03.2005 19:55
Wohnort: dortmund

Exe aus purebasic heraus

Beitrag von romartens »

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!
purebasic 3.93
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Es ist möglich ;). Aber viel zu kompliziert für einen einfachen galerie maker ;). Du könntest versuchen eine Exe zu schreiben die ein paar bilder aus nem archiv (seis im Programm mit inbegriffen) ausliest und diese dann anzeigt.
Bild
Benutzeravatar
romartens
Beiträge: 57
Registriert: 23.03.2005 19:55
Wohnort: dortmund

Exe aus purebasic heraus

Beitrag von romartens »

das komplizierte stört mich nicht will nur wissen wie?
purebasic 3.93
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

asm, gaaaanz viel asm :twisted:. Geh lieber den weeg ein 2. Programm zu schreiben.
Bild
Benutzeravatar
romartens
Beiträge: 57
Registriert: 23.03.2005 19:55
Wohnort: dortmund

ja

Beitrag von romartens »

und wie mache ich das mit dem zweiten programm schreiben aus einer exe heraus!
ich meine kenne mich schon ein bisschen aus aber nicht da!
mit purebasic

kann mir da jemand helfen?
purebasic 3.93
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

mhhh... wird jetz viel zum schreiben. Zumal ich tot müde bin (kann mich nicht daran errinern, gestern oder heute geschlafen zu haben :coderselixir:)

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]
Hier ein bischen Code:
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
endstructure
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 >__<
Bild
Benutzeravatar
romartens
Beiträge: 57
Registriert: 23.03.2005 19:55
Wohnort: dortmund

Exe aus purebasic heraus

Beitrag von romartens »

das bringt mich schon mal weiter
purebasic 3.93
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

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. :(
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

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
Antworten