Seite 1 von 2

Wie exportiere ich eine Ressource?

Verfasst: 09.07.2010 22:54
von max_oldliner
Guten Abend alle zusammen,

ich habe gerade die Funktion unter Compiler --> Compiler Optionen --> Ressourcen gesehen das man jede X-belibige Datei in die *.exe Datei packen kann. Nun war die erste Frage die sich mir gestellt hat: "Wie ich eine solche Ressource wieder als normale Datei abspeichern kann?
Also wie ich sie exportieren kann.

Habe in der Hilfe leider nicht dazu entdeckt.

max_oldliner

Re: Wie exportiere ich eine Ressource?

Verfasst: 09.07.2010 23:12
von ts-soft
max_oldliner hat geschrieben:Habe in der Hilfe leider nicht dazu entdeckt.

max_oldliner
Ist ja auch API, wenn Du die Windows-Resourcen meinst.
Diese Routine bringt Dich auch den richtigen Weg. Also Resource finden: FindResource_(), Resource laden: LoadResource_(), größe ermitteln SizeOfResouce_() und Pointer finden: LockResource_().
Danach den Speicher nur noch auf Platte schreiben. Mit IncludeBinary hättest Du es bestimmt einfacher.

Gruß
Thomas

Re: Wie exportiere ich eine Ressource?

Verfasst: 09.07.2010 23:33
von max_oldliner
Vielen Dank ts-soft.
Mit den befehlen konnte ich sogar einen guten Thread im englischem Board finden:

http://www.purebasic.fr/english/viewtop ... 12&t=17950

Jetzt habe ich folgenden Code:

Code: Alles auswählen

ProcedureDLL SaveResourceAs(Name.s,File.s)
  
  ; (Use GetModuleHandle_ if you want to specify another file)
  
  HandleResource= FindResource_(0,@Name,#RT_RCDATA)
  If HandleResource
    HandleGlobalMemoryBlock=LoadResource_(0,HandleResource) 
    PointerFirstByteOfTheResource=LockResource_(HandleGlobalMemoryBlock)
    
    ; Get size of the resource
    Size= SizeofResource_(Handle,HandleResource)
    
    ; Save the file
    FileId=OpenFile(#PB_Any,File)
    If FileId
      WriteData(FileID,HandleGlobalMemoryBlock,Size)
      CloseFile(FileId)
    EndIf
    
    ; Test if the file is written
    If FileSize(File)=Size 
      ProcedureReturn 1
    EndIf
  EndIf
  
EndProcedure

SaveResourceAs("bild.jpg", "C:\test.jpg")
Ich habe die Datei bild.jpg eingebunden. Komisch ist nur das die *.exe Datei nur 50 kb groß ist obwohl das Bild 1,5 mb groß ist.

Ich habe keine Ahnung woran das liegt.

max_oldliner

Re: Wie exportiere ich eine Ressource?

Verfasst: 09.07.2010 23:37
von ts-soft
Ich hoffe, Du hast den Link in meinem Posting (Diese) nicht übersehen :wink:

Re: Wie exportiere ich eine Ressource?

Verfasst: 09.07.2010 23:38
von max_oldliner
Nein aber die andere Funktion fand ich einfacher.

Re: Wie exportiere ich eine Ressource?

Verfasst: 09.07.2010 23:40
von HeX0R
Wirklich einfach wäre, die von Thomas bereits erwähnte Funktion IncludeBinary.

Re: Wie exportiere ich eine Ressource?

Verfasst: 09.07.2010 23:41
von ts-soft
max_oldliner hat geschrieben:Nein aber die andere Funktion fand ich einfacher.
:roll:
Das Ergebnis ist der Pointer und in *ResSize befindet sich die Größe, einfacher gehts nicht /:->

Re: Wie exportiere ich eine Ressource?

Verfasst: 10.07.2010 00:38
von max_oldliner
Okay danke. Der Funktionsaufruf ist ja:

Code: Alles auswählen

GetResource(ResNr.l, ResName.s, ResType.l, hModule.l = 0, *ResSize.long = 0)
Der ResName wäre ja in meinem Fall "bild.jpg" aber was ist der Res Type?

Re: Wie exportiere ich eine Ressource?

Verfasst: 10.07.2010 00:44
von Kiffi
ts-soft hat geschrieben:Mit IncludeBinary hättest Du es bestimmt einfacher.
Grüße ... Kiffi

Re: Wie exportiere ich eine Ressource?

Verfasst: 10.07.2010 00:46
von max_oldliner

Code: Alles auswählen

If CreateFile(0,"C:\neuedatei.png")
  WriteData(0, ?IncludeStart, ?IncludeEnd-?IncludeStart)
  CloseFile(0)
EndIf


DataSection
  IncludeStart:
    IncludeBinary "C:\parsed.png"
  IncludeEnd:
EndDataSection
Hab ihn gefunden. By Dark.