Da möchte man mal schnell einen Beispiel-Code zeigen, aber blöderweise
benötigt dieser zusätzliche Ressourcen, wie zum Beispiel Bilder.
Ohne die Ressourcen hochladen zu müssen, kann man sich einer DataSection bedienen,
in der die Binärdaten als Quads oder ähnlichem enthalten sind.
Um die Erzeugung von solchen DataSections zu erleichern habe ich dieses Werkzeug geschrieben:
Es ermöglich einfach per Drag&Drop eine oder mehrer beliebige Binärdatei
als DataSection an die aktuelle Position im Editor einzufügen!
Als Sprungmarke wird gleich der Dateiname (mit filterung von Sonderzeichen) genutzt.
Auch die Einrückung wird automatisch aus der PB.perfs gelesen.
Hinweis: Jedoch sollte man eine Größe von 100KB nicht überschreiben, da ansonsten über 2000 Zeilen eingefügt werden.
Hier ist der Quellcode des Tools:
Code: Alles auswählen
EnableExplicit
Enumeration
#File
#RegularExpression
EndEnumeration
Structure QuadArray
q.q[0]
EndStructure
Procedure GetProcessFromWindow(WindowID.i)
Protected ProcessID.i
If GetWindowThreadProcessId_(WindowID, @ProcessID)
ProcedureReturn OpenProcess_(#PROCESS_ALL_ACCESS, #False, ProcessID)
EndIf
EndProcedure
Procedure SendText(ScintillaID.i, Text.s)
Protected ProcessID.i = GetProcessFromWindow(ScintillaID)
Protected Length.i
Protected *MemoryID, *Buffer, Format.i
If ProcessID
Select SendMessage_(ScintillaID, #SCI_GETCODEPAGE, #Null, #Null)
Case 0 : Format = #PB_Ascii
Case 65001 : Format = #PB_UTF8
EndSelect
Length.i = StringByteLength(Text, Format)
*Buffer = AllocateMemory(Length+SizeOf(Character))
If *Buffer
PokeS(*Buffer, Text, #PB_Default, Format)
*MemoryID = VirtualAllocEx_(ProcessID, #Null, Length, #MEM_RESERVE|#MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
If *MemoryID
WriteProcessMemory_(ProcessID, *MemoryID, *Buffer, Length, #Null)
SendMessage_(ScintillaID, #SCI_ADDTEXT, Length, *MemoryID)
VirtualFreeEx_(ProcessID, *MemoryID, Length, #MEM_RELEASE)
EndIf
FreeMemory(*Buffer)
EndIf
CloseHandle_(ProcessID)
EndIf
EndProcedure
Procedure.s GetNamePart(FullPathName.s)
If GetExtensionPart(FullPathName)
ProcedureReturn Left(GetFilePart(FullPathName), Len(GetFilePart(FullPathName))-Len(GetExtensionPart(FullPathName))-1)
Else
ProcedureReturn GetFilePart(FullPathName)
EndIf
EndProcedure
Procedure.s GetIndentString()
OpenPreferences(GetEnvironmentVariable("APPDATA")+"\PureBasic\PureBasic.prefs")
PreferenceGroup("Global")
If Val(ReadPreferenceString("RealTab", "1"))
ProcedureReturn #TAB$
Else
ProcedureReturn Space(Val(ReadPreferenceString("TabLength", "2")))
EndIf
ClosePreferences()
EndProcedure
Define IndentString.s = GetIndentString()
Define FileName.s = ProgramParameter(0)
Define *Buffer.QuadArray, Length.i
Define Output.s, Index.i, LastIndex.i
Define WindowID.i = Val(GetEnvironmentVariable("PB_TOOL_MAINWINDOW"))
Define Label.s = GetNamePart(FileName)
If Not WindowID
MessageRequester("IncludeBinary.Tool", "Fehler: Das Programm kann nicht außerhalb von PureBasic gestartet werden!")
End
EndIf
If Not FileName
MessageRequester("IncludeBinary.Tool", "Fehler: Es wurde keine Datei übergeben!")
End
EndIf
CreateRegularExpression(#RegularExpression, "\W")
Label = ReplaceRegularExpression(#RegularExpression, Label, "_")
FreeRegularExpression(#RegularExpression)
CreateRegularExpression(#RegularExpression, "^\d")
If MatchRegularExpression(#RegularExpression, Label)
Label = "_" + Label
EndIf
FreeRegularExpression(#RegularExpression)
If ReadFile(#File, FileName)
Length = Lof(#File)
If Length % SizeOf(Quad)
Length + (SizeOf(Quad) - Length % SizeOf(Quad))
EndIf
LastIndex = Length / SizeOf(Quad) - 1
*Buffer = AllocateMemory(Length)
If *Buffer
ReadData(#File, *Buffer, Length)
Output + "DataSection"+#CRLF$
Output + IndentString + Label+":"
For Index = 0 To LastIndex
If Index % 5 = 0
Output + #CRLF$ + IndentString + "Data.q $"+RSet(Hex(*Buffer\q[Index], #PB_Quad), 16, "0")
Else
Output + ",$"+RSet(Hex(*Buffer\q[Index], #PB_Quad), 16, "0")
EndIf
Next
Output + #CRLF$+"EndDataSection"+#CRLF$
SendText(FindWindowEx_(WindowID,0,"Scintilla",0), Output)
FreeMemory(*Buffer)
EndIf
CloseFile(#File)
EndIf
(Alle Dateien bezieht sich nicht auf die PB-Dateien)Kommandozeile: [Pfad zu euer EXE]
Name: [Name des Werkzeugs]
Ereignis zum Auslösen des Werkzeugs: "Dateianzeiger ersetzen - Alle Dateien"
Hier ein Beispiel, mit per Drop eingefügten DataSection:
Code: Alles auswählen
UsePNGImageDecoder()
OpenWindow(#PB_Any, 0, 0, 128, 128, "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any, 48, 48, 32, 32, ImageID(CatchImage(#PB_Any, ?Beispiel)))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
Beispiel:
Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000020000000,$7A7A730000000608,$47527301000000F4
Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$130B0000130B0000
Data.q $000000189C9A0001,$05D907454D497407,$A7CC490C1B1E1309,$54414449E8070000,$E5558C6B56BDC358
Data.q $E667BEE77F7B5D15,$1006181EF3B99DCE,$4854747411148070,$689B535AB4A34115,$D8D36C3FB68A3FAB
Data.q $6D1B698DA8D1FD34,$C6A1A3536254D44C,$45F11D0AD56C5B54,$CC280861190531E5,$3DCF7DCCC1E61CF0
Data.q $3043FBBD9CF735F7,$7F7C9DD350CC0AAD,$AD7BDECEBDAC9CBE,$CF19352F19A611FD,$57568ADEBB2FCBDA
Data.q $78CE722636A39BFB,$FCDEC4606F7F9522,$E40164398BDCB1C9,$54D1E10BDC00D800,$F741FA3AE6BB3F13
Data.q $5B9BDF358EEDBA07,$2C128038E8A1B553,$FC6A3D78E03285D7,$672676AB26591CFE,$D48ED2B2BFB633E5
Data.q $D1FF396550DD66D7,$D6F1BF97ECA6B600,$C7BB95D434D71B07,$B27FEB000023D362,$91E1D8E1FF537A2E
Data.q $0622555152665131,$1BC3010A38E30A7D,$61C06001AEA781AE,$C46E6AE8BD83F183,$E3EE3B6EBCF5EF65
Data.q $6043A6B4C59E7600,$10244A1C7FC3A1C5,$11552042B8E1050C,$8281030C42220940,$AFAB10D885213B5D
Data.q $22E9607E31D34652,$B0EE3B6E27A77DCC,$BE4C33F44978E98F,$DF400056ACF0D250,$19537DBC93EFABED
Data.q $50175C45401C7110,$2102A044080B8885,$EE62544D45422511,$EC76CB0F3C5D6E24,$3F0C0537B09D1DCB
Data.q $12F3FC4FFD1D1259,$010C4E6402E97C78,$EDC7EBE2C480BAC1,$5018280154111282,$42906510042B2A88
Data.q $BC2CB06165AF615C,$EA58343F3FCC31B2,$705F5E19F2ED8B1D,$8ACB713086A2E065,$73544278B32A76FD
Data.q $98975C14AE3BC8AA,$008804010504C419,$18B9AD1EBABE4110,$BB3DCECF7B809BF7,$97D36572557F867D
Data.q $004E63BDF60B9B61,$A6F7DAA78C6CB4E9,$A632C04C71DB41B3,$4C2BA4D33017E029,$6FADEA2AACB88504
Data.q $AC7AD12294726F65,$AABA4F0071E77F7E,$35415553924B9DAF,$BC3C8E67CD004E80,$0925C0A135DEFDA0
Data.q $EA3671AB04B970A8,$44D6F23163FA02DD,$7DF8020D775B9BE8,$74A15CC9C4F0285B,$86CC86B3DEE03E51
Data.q $795A6E3FFDFCFD6E,$C97CF1E2FE226377,$962473AD2264A725,$747ED62F0AC2F18C,$09B0011FCEC47628
Data.q $7A2327FE46000BC0,$2AD7775FEFAA6A36,$77C7C2A9CE72492D,$1B6D0F5EF3363A9C,$A4654AEB8E3DE5CD
Data.q $6FA002DA22F9631E,$04BF4A913C9A3FED,$3B2A943AC788B9E0,$F0EB1A1BC2728BE5,$26BB725D13DFB6F6
Data.q $4B9DE154A079BEEE,$F8D6BA68D4EC41EC,$3D415CC955032A99,$1A9D3E6963FDD5EA,$FE3C50C8ECB163C5
Data.q $BAC59F48008F0017,$939D8D1F7F0EA9B5,$A057EBE7A88C17C0,$E37EDD22205DDDF3,$1D16C95CC866BF55
Data.q $180EA96D6C6992A2,$2C944AF85C79620B,$BA4155223D033D02,$FBBE7555AD7C6C37,$AD4E253BE97CBDAF
Data.q $9C54FCBE90F3797A,$D6D605569D63F3BE,$3B2B83853246F044,$00136BD9199ACC97,$6F66190C57AF1862
Data.q $5C89E1D17C8C1440,$105F32792B2AAA51,$C0CED6405BF62CB5,$DE1F19E6C914763E,$C003B0033F2DB7F0
Data.q $99237A2305F15B39,$9265B554D22B0002,$7023810A4B88EA14,$E24082888115C489,$02AFB2925DB48361
Data.q $FBBB97DAF89D709E,$A6ED6308ADC5244E,$57CE7800BA00F5AD,$BF6D2FEB05DD2F81,$1630BCB2CEB70C2F
Data.q $AC32212C64C4A391,$8C5985969F057160,$BDBC558204889310,$3BDADD36322EA37B,$157802B72727E768
Data.q $0DE02F3843DA7E40,$B03D5801D72617F6,$5952B7669B1BCAEA,$5F2C328E1FAF5E09,$5D5152E5016CB110
Data.q $3E81CF426D135417,$89A9437DF18DC92C,$1C87A22DBB4686B7,$82EE97C15217C3D5,$2F36A7801286E6AE
Data.q $A5F26CDEDED7D85F,$E01FEEF421FC0532,$37177BBDDA3EDF44,$D75434C631AE29DA,$CC3D23B9471389F2
Data.q $774686B79D26644F,$EBCFC92A7A798C04,$2B03C570D19DBF03,$E5F9F7E082CAEF97,$1DDFCC3E3438E0E0
Data.q $C019F616C91F8E18,$19B6B6FF3BD2ADBE,$9C17C4FA10B16E2D,$F0C8CEBB23C1CDFC,$A7A045FFF15D539F
Data.q $400041D7FAAE2173,$5546F3E331D5CEF2,$3EFEEEFC8A644DC9,$FE4B10389E573A7D,$AA78DF7E22EFC015
Data.q $00074000B0036A58,$06EDC739DD32C84F,$5ED6146CE04517A0,$088E4ABB870DDDBB,$127BCBD8EFD60F19
Data.q $B3345892D5996931,$E439FFBFBE1F89E5,$60ACF8D7DFB38952,$025E770342E0E4B2,$94EF371B9ABE6FA7
Data.q $6ACCD717ED7CD72D,$6093030888E4B479,$5501E44F48822A04,$DCF4FE5CE033664E,$AD81F769FCF7B305
Data.q $3CFF10006FF6F6EB,$7811A9D139098870,$BAC3C3E5BA7CF973,$6EB566CB5DC5EAED,$60A42A390022A077
Data.q $4C0717E7CB61E361,$D3F18944C0A0B2B9,$A1C18022BAA09288,$3B2BF9F749B14353,$801F69B0D9107DE6
Data.q $E67E0EB2C2F3AACF,$05B05ECE93D929C8,$FBF0AC186F3BD915,$1D942D5D76C01022,$6CA0B650CCA0B255
Data.q $590F8F10CCC0B040,$3CB5E02565C99A58,$2AF09391C50672BE,$6FA67A1CD6D5B64E,$40057E9D8F07F5E0
Data.q $8AD11055502D4A72,$C6673B5E9E1ADB07,$8428557F2A9125BC,$52D86423AC95D974,$112E188096CAC362
Data.q $812CB5D87B288C43,$3885F2154572A3E5,$06F0BB0B449F4F95,$FA3EEBE399E3B0FC,$98026F52C4EFA7E4
Data.q $C34754014B81273C,$D79D007CCCF13D55,$F259A86EAEAB4384,$516B47B46733D9FD,$1110A89C8C094654
Data.q $CC2C5811190B0C94,$54F1E258C6CBC6C2,$AA61B1E3966869B0,$479C26A6369B7BE9,$0061F5595AF93E3E
Data.q $5E467F503DE74F1F,$78B43ED73D06962B,$DAA2F0BAD139B2FE,$085952F1A3C9A45A,$602F180C35058044
Data.q $0D6932246143F82C,$CF4A248E8F30EFF7,$8F6A87F005EF1A9F,$20FDA614ECBA4AF5,$C9A3CFFF8D5376F9
Data.q $B57715812ACB0016,$79B8EBAC6AAD7635,$42525085672B1CF6,$925582FB130885CE,$1FF7007C3A38C64C
Data.q $78197AA58F752D1F,$4D3488DAE7CD805C,$0FCCB003CC0006D9,$339D9D2D79CBFF5C,$8ADE33AD1C5CCF66
Data.q $08FC68488F8C4E28,$B7654DEF9C3FD1DF,$8755F05B0294F012,$0046BEBC053568FE,$B7CABAF6F87801D7
Data.q $5DB0B8DA9B98EB1F,$9FA6F0009CAEAB2F,$1F015F483F2A6BB9,$02AE0015C011A003,$1F4AE0B57E180C50
Data.q $B4CF05F01ED1DFFE,$6FC4A3A56FF1CA69,$00000000B00122A1,$826042AE444E4549
EndDataSection