Wie exportiere ich eine Ressource?

Anfängerfragen zum Programmieren mit PureBasic.
max_oldliner
Beiträge: 15
Registriert: 02.07.2010 13:00

Wie exportiere ich eine Ressource?

Beitrag 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
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

Re: Wie exportiere ich eine Ressource?

Beitrag 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
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
max_oldliner
Beiträge: 15
Registriert: 02.07.2010 13:00

Re: Wie exportiere ich eine Ressource?

Beitrag 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
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

Re: Wie exportiere ich eine Ressource?

Beitrag von ts-soft »

Ich hoffe, Du hast den Link in meinem Posting (Diese) nicht übersehen :wink:
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
max_oldliner
Beiträge: 15
Registriert: 02.07.2010 13:00

Re: Wie exportiere ich eine Ressource?

Beitrag von max_oldliner »

Nein aber die andere Funktion fand ich einfacher.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Wie exportiere ich eine Ressource?

Beitrag von HeX0R »

Wirklich einfach wäre, die von Thomas bereits erwähnte Funktion IncludeBinary.
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

Re: Wie exportiere ich eine Ressource?

Beitrag 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 /:->
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
max_oldliner
Beiträge: 15
Registriert: 02.07.2010 13:00

Re: Wie exportiere ich eine Ressource?

Beitrag 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?
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie exportiere ich eine Ressource?

Beitrag von Kiffi »

ts-soft hat geschrieben:Mit IncludeBinary hättest Du es bestimmt einfacher.
Grüße ... Kiffi
a²+b²=mc²
max_oldliner
Beiträge: 15
Registriert: 02.07.2010 13:00

Re: Wie exportiere ich eine Ressource?

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