Seite 1 von 2

Prinzipfragen zu DLL gestütztem Modulsystem

Verfasst: 16.02.2009 01:11
von Blackskyliner
Hallo,
ich wollte mal wissen ob und wie ich in einer DLL einen Thread starten kann.
Der Hintergrnd:
Ich will ein kleines Pluginähnliches System bauen, wo die DLL die geladen wird durch AttachProccess() sich selber einen Thread startet und sich dort dann weiterhin selber ausführt. Nun bekomme ich aber bei meinem kleinen Testcode einen MemoryAccess error.

Deshalb erstmal die grundlegende Frage: "Ist es überhaupt möglich im AttachProccess() ein CreateThread() auszuführen?"

Danke für jede Antwort :)

MFG
Blackskyliner


EDIT: Titel von "Thread in einer DLL?" umbenannt zu "Prinzipfragen zu DLL gestütztem Modulsystem"

Verfasst: 16.02.2009 12:06
von Thorium
Code bitte.
Generell geht das.

Verfasst: 16.02.2009 13:30
von PMV
Dafür brauchst eine extra Prozedur, die nach dem Laden manuell
aufgerufen werden muss. Ich mein mich zumindest erinnern zu können,
dass ich das selbe auch mal wollte, aber es ist laut MSDN nicht erlaubt.
Angaben ohne Gewähr

MFG PMV

Verfasst: 16.02.2009 13:51
von HeX0R
Den MemoryAccess-Error bekommst du bestimmt, weil du (wie üblich) deiner Thread-Prozedur keinen Parameter spendiert hast...

Verfasst: 23.02.2009 23:44
von Blackskyliner
Der Thread hat schon seine Var von mir bekommen. PMV das selbe hab ich auch gelesen, soweit ich das aber verstanden hab, haben das einige in VB oder so mal so geregelt,das die das einfach aus den Attach in eine Extra Funktion auslagerten und da dann einen Thread gecalled haben.
Das selbe habe ich versucht un dscheinbar daran gescheitert.
Wäre halt einfach schön, dass ich nicht eine feste Funktion, innerhalb meines Programems aufrufen müsste dass es Funktioniert, wenns aber allgemein nicht geht, da lass ichs.

Hier noch den Code den ich habe. Wenn das Jemand zum laufen bekommen würede, wäre ich äußerst entzückt =)

Test.dll

Code: Alles auswählen

DeclareDLL DLLMain()
DeclareDLL Worker(*nullVar.l)


ProcedureDLL AttachProcess()
	;Initialize all Variables und Call DLLMain 
	;to avoid the Call Loop documented on MSDN
	DLLMain()
	
EndProcedure

ProcedureDLL DLLMain()
	;Create the Worker Thread
	CreateThread(@Worker(), 0)
EndProcedure

ProcedureDLL Worker(*nullVar.l)
	;Say that you loaded... Hopefully sometimes...
	MessageRequester("DLL", "Successful loaded.")
EndProcedure

ProcedureDLL DetachProcess()
	;Clear all initialized Variables
EndProcedure
und hier der Schnippsel mit dem ichs Teste.

Code: Alles auswählen

OpenLibrary(0, "Test.dll")

Sleep_(10000)

Bin dankbar für jede Hilfe und jeden nützlichen und verwertbaren Gedanken.

MFG
Blackskyliner

Verfasst: 24.02.2009 00:30
von PMV
Wenn ich Recht habe ist das nicht möglich. Dann ist eine Init-Prozedur die
gängige Methode und eigentlich auch kein Beinbruch. :wink:

MFG PMV

Verfasst: 24.02.2009 00:38
von Thorium
Der Code funktioniert wunderbar mit PB 4.30 Final auf meinem Rechner.

Das Problem könnte einfach sein das du Threadsave nicht aktiviert hast?
Du nutzt in dem Thread Strings, da _musst_ du Threadsave aktivieren.

@PMV: Klar ist das möglich. ^^
Die Einschränkung ist nur, das die Attach-Prozedur nur einen Thread starten darf.

Was mir grad noch einfällt, mach mal das .l bei "DeclareDLL Worker(*nullVar.l)" weg. Glaube aber das PB das da sowieso ignoriert. Ansonsten würde es bei 64Bit Kompilierung krachen.

Verfasst: 24.02.2009 00:43
von Blackskyliner
Bekomm immernoch den Fehler. Werd mir da halt mal 4.3 laden :D

Nur das Problem ist dass ich einige ältere Projekte nicht kompellieren konnte und deswegen erstmal auf der 4.2 hängen geblieben bin... Werd ich einfach die 4.3 in ein ANderes Verzeichniss installieren und da gehts dann hoffentlich. Ich melde mich später nochmal ;)

Achja und Threadsave war wirklich deaktiv :oops: , hat aber an der Sache selber nichts verändert.

Wäre aber trotzdem cool, wenn man das noch irgendwie unter 4.2 Zum laufen bekähme...

Verfasst: 24.02.2009 00:46
von PMV
:mrgreen:

Ha, das was ich mein ging glaub ich generell nur um DLLs, die in
AttachProzess nicht geladen werden dürfen ... das starten eines Threads
hab ich auch so umgesetzt. :lol: ... hät mal auf meinen Code schauen
sollen. /:->

Ich hatte es mit der 4.2 erfolgreich umgesetzt.
Deine ganzen .l sind übrigends fehlerhaft. Zeiger sind ihr eigener Datentyp.

MFG PMV

Verfasst: 24.02.2009 00:51
von Blackskyliner
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