Prinzipfragen zu DLL gestütztem Modulsystem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
HeX0R
Beiträge: 3042
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:

Beitrag von HeX0R »

Ist ja schön, dass du an den Parameter bei der Thread-Prozedur gedacht hast, aber AttachProcess() und DetachProcess() benötigen auch einen.

Dann geht es auch...
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Danke. :allright:

Jetzt funktioniert alles, da kann ich mich ja endlich ransetzen und auch was damit umsetzen. Muss mir unbedingt merken das so ziemlich alles einen ersten Parameter hat xD.


<) <) <) <)
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
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 »

Blackskyliner hat geschrieben:Ahh, ok dachte nur, da Zeiger ja eine Adresse sind dass man die halt als .l machen muss da eine Adresse ja Als Zahl wiedergespiegelt wird. K.A. wo ich diese Art und weise her hab, irgendwo mal aufgeschnappt. Klappt irgendwie trotzdem nicht :( Immernoch Memory Access Error
pointer (zeiger, speicheradressen) sind niemals von einem nativen PB Typ
(.l, .i, .w, .b, .s, .q)!

richtig:
*zeiger

auch richtig:
*zeiger.integer
(dies ist kein nativer Typ, sondern lediglich eine Strukture, die den Zugriff
vereinfacht)

falsch:
*zeiger.l
*zeiger.i

usw.
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
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Ich wollte bloß mal noch meinen Fortschritt hier posten und Fragen was man an dem internen Handling der einzelnen Module verändern oder gar verbessern könnte...

Das Script nutzt die EasyVent Funktionen von purecoder.net

Code: Alles auswählen

XIncludeFile "EasyVENT.pbi"

Define w.l, wev.l

Global moduleDirectory$ = "./modules/";

Structure loadedModules_struct
	id.l
	name.s
	isLoaded.b
	shouldLoaded.b
EndStructure

Global NewList loadedModules.loadedModules_struct();

w = OpenWindow(0,0,0,300,300,"ModuleLoader v0.2 Beta", #PB_Window_SizeGadget | #PB_Window_SystemMenu)
If w
	If CreateGadgetList(WindowID(0));
		TreeGadget(0,0,0,0,0)
		ListIconGadget(1,0,0,0,0,"Module", 100, #PB_ListIcon_CheckBoxes)
	Else
		End
	EndIf
Else
	End
EndIf

Procedure resizeGadgets(*sender.PB_Sender = #Null)
	ResizeGadget(0,0,0,WindowWidth(0)/2, WindowHeight(0));
	ResizeGadget(1,WindowWidth(0)/2,0,WindowWidth(0)/2, WindowHeight(0));
EndProcedure
resizeGadgets()

Procedure loadModules()
	Protected id.l
	ForEach loadedModules()
		If loadedModules()\shouldLoaded = #True And loadedModules()\isLoaded = #False
			id = OpenLibrary(#PB_Any, moduleDirectory$+loadedModules()\name)
			loadedModules()\id = id;
			loadedModules()\isLoaded.b = #True;
		EndIf
		
		If loadedModules()\shouldLoaded = #False And loadedModules()\isLoaded = #True
			CloseLibrary(loadedModules()\id)
			loadedModules()\id = #Null;
			loadedModules()\isLoaded.b = #False;
		EndIf
	Next
EndProcedure

Procedure readModules()
	If ExamineDirectory(0, moduleDirectory$, "*.dll")
		While NextDirectoryEntry(0)
			AddElement(loadedModules())
			loadedModules()\id = #Null
			loadedModules()\name = DirectoryEntryName(0);
			loadedModules()\isLoaded.b = #False;
			loadedModules()\shouldLoaded = #False
			
			AddGadgetItem(1, -1, DirectoryEntryName(0))
		Wend
    	FinishDirectory(0)
	EndIf
EndProcedure
readModules()

Procedure checkBoxHandle(*sender.PB_Sender)
	Protected clickedElement.l, clickedName.s, clickedState.l
	clickedElement = *sender\wParam & $FFFF;
	clickedName = GetGadgetItemText(1,clickedElement-1)
	clickedState = *sender\state - 1
	
	ForEach loadedModules()
		If clickedName = loadedModules()\name
			If clickedState = 0
				loadedModules()\shouldLoaded = #True
			Else
				loadedModules()\shouldLoaded = #False
			EndIf
		EndIf
	Next
EndProcedure

Procedure Close(*sender.PB_Sender)
	PerformDefaultWinProcessing(*sender)
  	ProcedureReturn #Event_ReturnDefault
EndProcedure


SetEventHandler(WindowID(0), #OnClose, @Close())
SetEventHandler(WindowID(0), #OnResize, @resizeGadgets())
SetEventHandler(GadgetID(1), #OnItemCheckboxChanging , @checkBoxHandle())



Repeat
	loadModules();
  	wev = WaitWindowEvent()
Until wev = #PB_Event_CloseWindow
End
PS.: Ist nur relativ schnell gemacht, soll aber das Grundsystem bilden und dass sollte nicht grade irgendwie buggy sein und auch nicht grade _der_ Performancekiller. Ich freue mich über jeden Hinweis, der den Loader verbessert :)

Declares für die Funktionen mach ich demnächst noch =)


Und dann noch ne Prinzip frage... gibt es eine möglichkeit, dass ich Daten zwischen den einzelnen Modulen austauschen lassen kann? Ich habe mir gedacht das ich einen MessageStack als Array oder Liste anlege, über den ich dann in einem Repeat Zyklus eine Funktion der Libarys aufrufe, wenn diese denn vorhanden ist. Nur wie kann ich von der Libary aus Daten in den Loader bekommen, zum austausch?? Über eine weitere Funktion, die mir dann ein MessageStack von dem Modul zurückgibt?? Wie würdet ihr es denn regeln?

Ich danke für alle Hinweise, muss auch nicht unbedingt COde sein sondern einfach nur die Theorie. Soll ja auch schlißlich was dabei lernen ;)

MFG
Blackskyliner
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Antworten