Seite 1 von 3

Tool - DataSection+Data einer Datei per Drop auf den Editor

Verfasst: 11.08.2011 03:34
von STARGÅTE
Jeder kennt das aus dem Forum:
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
Einfach eine EXE erzeugen und als Werkzeug mit folgenden Parameter einbinden:
Kommandozeile: [Pfad zu euer EXE]
Name: [Name des Werkzeugs]
Ereignis zum Auslösen des Werkzeugs: "Dateianzeiger ersetzen - Alle Dateien"
(Alle Dateien bezieht sich nicht auf die PB-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

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 11.08.2011 17:03
von bobobo
Wenn ein Bild eine Zahl als Name hat gips Probleme mit dem Label ,gell

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 11.08.2011 17:26
von STARGÅTE
Ah danke für den Hinweis.
Das war aber nicht immer so oder?
Zumindest ging es unter 3.3 noch, dass man folgenden Code ausführen kann:

Code: Alles auswählen

; PB 3.3 !
Goto 1
Debug "Nichts"
1: Debug "Hallo "+Str(?1)
Nagut, habs nun angepasst.

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 11.08.2011 18:40
von bobobo
das ging wohl bis ausschließlich 4.41

egal .. 3.3 ist ja sowas von alter Hut :mrgreen:

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 19.12.2011 13:54
von delikanli_19_82
das ganze klingt nach einer lösung, das ich suche. aber ich weiß nicht genau, wie das mit dem dragdrop und werkzeug funktionieren soll.

habe das noch nicht sinnvoll zum laufen bringen können.

bitte um aufklärung.

mfg

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 19.12.2011 15:08
von STARGÅTE
  1. Kopiere dir den Quellcode und speicher ihn bei dir ab.
  2. Erstelle daraus eine Exe, an einem Ort wo du das Werkzeug haben willst.
  3. Geh in den PB-Editor zu: Werkzeuge > Werkzeuge konfigurieren
  4. Klicke oben rechts auf Neu
  5. Gebe in der Kommandozeile links den Pfad der Exe ein, die du erstellt hast
  6. Gebe als Name den Namen des Werkzeugs an, den du haben möchtest.
  7. Wähle bei Ereignis zum Auslösen des Werkzeugs: "Dateianzeiger ersetzen - Alle Dateien"
  8. Klicke auf OK
  9. Klicke noch mal auf OK
Nun ist das Werkzeug erstellt.

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 16.09.2015 12:11
von NicTheQuick
Gibt es davon schon eine Version, die auch mit der neuen Beta funktioniert? Ich krieg das gerade auf Anhieb irgendwie nicht hin, ohne den kompletten Code zu überarbeiten. Die Anleitung zur Einrichtung des Werkzeugs scheint auch nicht mehr zu passen.

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 16.09.2015 13:43
von ts-soft
Du kannst alternativ auch dies hier nutzen: http://www.purebasic.fr/english/viewtopic.php?p=374183
Source funktioniert mit allen Versionen von PB, Crossplattform!

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 07.11.2015 16:54
von TheCube
Habe das Tool von Stargate immer gern genutzt, wollte den Code jetzt sogar noch
um eine BriefLZ-Variante erweitern.
Bin2Data (ts-soft) nutzt ja m.W. auschliesslich die ZLib ... k.A. wie man die Daten wieder entpackt.
UseBriefLZPacker() macht die EXE nur 5-6Kb grösser, da lohnt sichs auch mal nur ein 30KB .BMP zu packen.
Bei allen anderen Packern geht da der Packgewinn direkt flöten (UseZipPacker() : +75K (!) / ZLib weiss ich nicht)


Der Code oben lässt sich compilieren (naja ok ... not Filename zu Filename="" ändern)
und scheint weitgehend zu funktionieren. Aber es gibt keinen Scintilla-Output in das Editorfenster.
Mag der Code-Autor Stargate oder ein anderer "Wissender" das vielleicht fixen für PB ab 5.30 ? :praise:

Re: Tool - DataSection+Data einer Datei per Drop auf den Edi

Verfasst: 07.11.2015 19:08
von STARGÅTE
Problem ist, dass FindWindowEx_(WindowID,0,"Scintilla",0) mir seit der neuen IDE (5.30 glaube ich) keine gültige ID mehr zurück gibt, und das obwohl es immer noch "Scintilla" gibt.