Seite 1 von 2

CreateResourceFromIcon

Verfasst: 02.04.2006 02:23
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

Verfasst: 02.04.2006 02:44
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 :)

Verfasst: 02.04.2006 02:54
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 ;)

Verfasst: 02.04.2006 03:13
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:

Verfasst: 02.04.2006 13:05
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

Verfasst: 02.04.2006 13:19
von ts-soft
Noch mehr Müll :freak:

Verfasst: 02.04.2006 13:22
von Deeem2031
Seltsam, bei mir funzts wunderbar :|

Verfasst: 02.04.2006 13:26
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:

Verfasst: 02.04.2006 13:29
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 ;)

Verfasst: 02.04.2006 13:37
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)