CreateResourceFromIcon

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
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

CreateResourceFromIcon

Beitrag von Deeem2031 »

PB3.94 Code - Der Code ist fehlerhaft! Hab ich aber der Vollständigkeit und des Verständnis halber drin gelassen. Für mehr Infos einfach die anderen beiträge lesen ;)

Code: Alles auswählen

Procedure CreateResourceFromIcon(IconFile.s,ResFile.s) 
  Protected Res_Type,Res_Name,MemoryFlags,LanguageID,Version,HeaderSize,F_ICO,*Mem,ResDataSize,Offset,F_RES 
  
  Enumeration 
    #Res_String = 0 
    #Res_Cursor = 1 
    #Res_Bitmap 
    #Res_Icon 
    #Res_Menu 
    #Res_Dialog 
    #Res_StringTable 
    #Res_FontDirectory 
    #Res_Font 
    #Res_AcceleratorsTable 
    #Res_RCData 
    #Res_Messagetable 
    #Res_GroupCursor 
    #Res_GroupIcon = $E 
    #Res_VersionInformation = $10 
    #Res_DialogInclude 
    #Res_PlugnPlay = $13 
    #Res_VXD 
    #Res_AnimatedCursor 
    #Res_newBitmap = $2002 
    #Res_newMenu = $2004 
    #Res_newDialog 
  EndEnumeration 
  
  Res_Type = #Res_Icon 
  Res_Name = 1 
  MemoryFlags = 0 
  LanguageID = 0 
  Version = 0 
  HeaderSize = 4+4+4+4+2+2+4+4 
  
  
  F_ICO = ReadFile(#PB_Any,IconFile) 
  If F_ICO 
    *mem = AllocateMemory(Lof()) 
    FileSeek($0E) 
    ResDataSize = ReadLong() 
    Offset = ReadLong() 
    FileSeek(0) 
    ReadData(*mem,Lof()) 
    CloseFile(F_ICO) 
  Else 
    ProcedureReturn #False 
  EndIf 
  
  F_RES = CreateFile(#PB_Any,ResFile) 
  If F_RES 
    WriteData(?EmptyResource,?EmptyResourceEnd-?EmptyResource) 
    
    WriteLong(ResDataSize) 
    WriteLong(HeaderSize) 
    WriteWord($FFFF) 
    WriteWord(Res_Type) 
    WriteWord($FFFF) 
    WriteWord(Res_Name) 
    WriteWord(MemoryFlags) 
    WriteWord(LanguageID) 
    WriteLong(Version) 
    WriteLong(0) 
    WriteLong(0) 
    WriteData(*mem+Offset,ResDataSize) 
  
    WriteLong($14) 
    WriteLong($20) 
    WriteWord($FFFF) 
    WriteWord(#Res_GroupIcon) 
    WriteWord($FFFF) 
    WriteWord($50) 
    WriteWord(0) 
    WriteWord(0) 
    WriteLong(0) 
    WriteLong(0) 
    WriteLong(0) 
    WriteData(*mem,$14) 
  
    ;WriteData(?EndResourceContent,?EndResourceEnd-?EndResourceContent) 
    CloseFile(F_RES) 
  Else 
    ProcedureReturn #False 
  EndIf 
  
  ProcedureReturn #True 
  
  DataSection 
    EmptyResource: 
    Data.b $00,$00,$00,$00,$20,$00,$00,$00,$FF,$FF,$00,$00,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 
    EmptyResourceEnd: 
    EndResourceContent: 
    Data.b $00,$00,$01,$00,$01,$00,$20,$20,$10,$00,$01,$00,$04,$00,$E8,$02,$00,$00,$01,$00 
    EndResourceEnd: 
  EndDataSection 
  
EndProcedure
Zuletzt geändert von Deeem2031 am 02.04.2006 14:05, insgesamt 1-mal geändert.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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

Beitrag von ts-soft »

Interessante Sache :allright:

Also, wenn ich es richtig verstanden habe, erstellt diese Funktion eine
*.res Datei. Wenn, dann kann man diese ja mit PB nicht linken, oder ?

Ein paar Sätze hätteste ruhig schreiben können :)
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
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

ts-soft hat geschrieben:Ein paar Sätze hätteste ruhig schreiben können :)
Och menno, da denkt man ma der Titel sagt alles und dann wird man doch dazu gezwungen einen Text dazu zu schreiben ;)
ts-soft hat geschrieben:Also, wenn ich es richtig verstanden habe, erstellt diese Funktion eine *.res Datei.
Genau.
ts-soft hat geschrieben:Wenn, dann kann man diese ja mit PB nicht linken, oder ?
*nachguck* Hm, joa. PB brauch anscheinend *.rc-Dateien. Aber die sind zu einfach zu machen als wenn man dafür eine Proc bräuchte ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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

Beitrag von ts-soft »

Man kann sie Prinzipiell schon linken, jaPBe macht das ja auch

Man muß also nur den PBCompiler dazu bringen, das er Polink sagt, diese
hinzuzufügen :freak:

Sollte irgendwie per UserLib in ASM oder so machbar sein
(*wink mit dem Zaunpfahl*)

Nachtrag:
Habs mal auf PB4 geändert und mit 2 versch. Icons getestet.

Die Proc liefert #True, aber ResHacker zeigt mit kein Icon, es sind zwar 2
Einträge enthalten: eine ohne Namen mit einer 14 Resource sowie ein Icon
mit einer 1 Resource, aber ohne Icon :freak:

Auch Polink meldet eine ungültige Resource bei folgendem Code:

Code: Alles auswählen

Import "229.res"
EndImport
MessageRequester("","")
Irgendwas läuft da noch schief.
Hier der PB4 Code:

Code: Alles auswählen

Procedure CreateResourceFromIcon(IconFile.s,ResFile.s)
  Protected Res_Type,Res_Name,MemoryFlags,LanguageID,Version,HeaderSize,F_ICO,*Mem,ResDataSize,Offset,F_RES
 
  Enumeration
    #Res_String = 0
    #Res_Cursor = 1
    #Res_Bitmap
    #Res_Icon
    #Res_Menu
    #Res_Dialog
    #Res_StringTable
    #Res_FontDirectory
    #Res_Font
    #Res_AcceleratorsTable
    #Res_RCData
    #Res_Messagetable
    #Res_GroupCursor
    #Res_GroupIcon = $E
    #Res_VersionInformation = $10
    #Res_DialogInclude
    #Res_PlugnPlay = $13
    #Res_VXD
    #Res_AnimatedCursor
    #Res_newBitmap = $2002
    #Res_newMenu = $2004
    #Res_newDialog
  EndEnumeration
 
  Res_Type = #Res_Icon
  Res_Name = 1
  MemoryFlags = 0
  LanguageID = 0
  Version = 0
  HeaderSize = 4+4+4+4+2+2+4+4
 
 
  F_ICO = ReadFile(#PB_Any,IconFile)
  If F_ICO
    *mem = AllocateMemory(Lof(F_ICO))
    FileSeek(F_ICO, $0E)
    ResDataSize = ReadLong(F_ICO)
    Offset = ReadLong(F_ICO)
    FileSeek(F_ICO, Offset)
    ReadData(F_ICO, *mem,ResDataSize)
    CloseFile(F_ICO)
  Else
    ProcedureReturn #False
  EndIf
 
  F_RES = CreateFile(#PB_Any,ResFile)
  If F_RES
    WriteData(F_RES,?EmptyResource,?EmptyResourceEnd-?EmptyResource)
   
    WriteLong(F_RES,ResDataSize)
    WriteLong(F_RES,HeaderSize)
    WriteWord(F_RES,$FFFF)
    WriteWord(F_RES,Res_Type)
    WriteWord(F_RES,$FFFF)
    WriteWord(F_RES,Res_Name)
    WriteWord(F_RES,MemoryFlags)
    WriteWord(F_RES,LanguageID)
    WriteLong(F_RES,Version)
    WriteLong(F_RES,0)
    WriteLong(F_RES,0)
    WriteData(F_RES,*mem,ResDataSize)
 
    WriteData(F_RES,?EndResource,?EndResourceEnd-?EndResource)
    CloseFile(F_RES)
  Else
    ProcedureReturn #False
  EndIf
 
  ProcedureReturn #True
 
  DataSection
    EmptyResource:
    Data.b $00,$00,$00,$00,$20,$00,$00,$00,$FF,$FF,$00,$00,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    EmptyResourceEnd:
    EndResource:
    Data.b $14,$00,$00,$00,$20,$00,$00,$00,$FF,$FF,$0E,$00,$FF,$FF,$50,$00,$00,$00,$00,$00,$00,$10,$07,$04,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$01,$00,$01,$00,$20,$20,$10,$00,$01,$00,$04,$00,$E8,$02,$00,$00,$01,$00
    EndResourceEnd:
  EndDataSection
 
EndProcedure
Das hinzulinken durch Import "Name.res" : EndImport funktioniert bei
heilen *.res :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
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Versuchs mal damit, jetzt bin ich mir allerdings nicht mehr sicher ob die Proc so stimmt.

Code: Alles auswählen

Procedure CreateResourceFromIcon(IconFile.s,ResFile.s)
  Protected Res_Type,Res_Name,MemoryFlags,LanguageID,Version,HeaderSize,F_ICO,*Mem,ResDataSize,Offset,F_RES
  
  Enumeration
    #Res_String = 0
    #Res_Cursor = 1
    #Res_Bitmap
    #Res_Icon
    #Res_Menu
    #Res_Dialog
    #Res_StringTable
    #Res_FontDirectory
    #Res_Font
    #Res_AcceleratorsTable
    #Res_RCData
    #Res_Messagetable
    #Res_GroupCursor
    #Res_GroupIcon = $E
    #Res_VersionInformation = $10
    #Res_DialogInclude
    #Res_PlugnPlay = $13
    #Res_VXD 
    #Res_AnimatedCursor
    #Res_newBitmap = $2002
    #Res_newMenu = $2004
    #Res_newDialog
  EndEnumeration
  
  Res_Type = #Res_Icon
  Res_Name = 1
  MemoryFlags = 0
  LanguageID = 0
  Version = 0
  HeaderSize = 4+4+4+4+2+2+4+4
  
  
  F_ICO = ReadFile(#PB_Any,IconFile)
  If F_ICO
    *mem = AllocateMemory(Lof())
    FileSeek($0E)
    ResDataSize = ReadLong()
    Offset = ReadLong()
    FileSeek(0)
    ReadData(*mem,Lof())
    CloseFile(F_ICO)
  Else
    ProcedureReturn #False
  EndIf
  
  F_RES = CreateFile(#PB_Any,ResFile)
  If F_RES
    WriteData(?EmptyResource,?EmptyResourceEnd-?EmptyResource)
    
    WriteLong(ResDataSize)
    WriteLong(HeaderSize)
    WriteWord($FFFF)
    WriteWord(Res_Type)
    WriteWord($FFFF)
    WriteWord(Res_Name)
    WriteWord(MemoryFlags)
    WriteWord(LanguageID)
    WriteLong(Version)
    WriteLong(0)
    WriteLong(0)
    WriteData(*mem+Offset,ResDataSize)
  
    WriteLong($14)
    WriteLong($20)
    WriteWord($FFFF)
    WriteWord(#Res_GroupIcon)
    WriteWord($FFFF)
    WriteWord($50)
    WriteWord(0)
    WriteWord(0)
    WriteLong(0)
    WriteLong(0)
    WriteLong(0)
    WriteData(*mem,$14)
  
    ;WriteData(?EndResourceContent,?EndResourceEnd-?EndResourceContent)
    CloseFile(F_RES)
  Else
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
  
  DataSection
    EmptyResource:
    Data.b $00,$00,$00,$00,$20,$00,$00,$00,$FF,$FF,$00,$00,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    EmptyResourceEnd:
    EndResourceContent:
    Data.b $00,$00,$01,$00,$01,$00,$20,$20,$10,$00,$01,$00,$04,$00,$E8,$02,$00,$00,$01,$00
    EndResourceEnd:
  EndDataSection
  
EndProcedure
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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

Beitrag von ts-soft »

Noch mehr Müll :freak:
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
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Seltsam, bei mir funzts wunderbar :|
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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

Beitrag von ts-soft »

Welches Format hat Dein ICON?
Größe, Farbtiefe usw.?

Wenns bei Dir geht, kannste das Icon ja mal in eine Exe einfügen, aber nur
mit PB4

Code: Alles auswählen

Import "DeineIcon.res" : EndImport 
Sollte funzen :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
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Hm, also PB4 meldet bei mir auch Fehler, habs sonst auch nur mit dem ILAssembler versucht... Naja, ich glaub ich lass das doch lieber und nutze PoRC ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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

Beitrag von ts-soft »

Oder XN - ResourceEditor, der macht Dir auch *.res aus Icons, sowie alle anderen Dateien.
http://www.wilsonc.demon.co.uk/delphi.htm
(Freeware)
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
Antworten