Seite 1 von 1

[solved]Probleme mit Funktionsparameter + DLL

Verfasst: 26.02.2009 22:03
von Blackskyliner
Hi
mal wieder ein DLL bezogenes Problem meinerseits.

Ich rufe aus meiner DLL eine Funktion auf, die mir das Programm, was die DLL einbindet übergibt. Dieser Funktion übergebe ich dann über das Argument eine Adresse auf eine Struktur...

Die Funktion kann dann alle Werte lesen bis auf einen, mit dem ich so meine Problem habe. Diese Variable ist ein Zeiger auf den Speicher einer Variable (in meinem Testfall ein String). ZUerst dachte ich es liegt daran, dass der String global definiert sein muss, auf den ich in meiner Struktur verweise.
Dem war aber leider nicht so. Wenn ich allerdings allen Code nicht getrennt in _ein_ Programm schreibe und das ausführe, dann funktionierts...
Also kann es ja nur irgendeine Farce sein die ich übersehe...
Wäre nett wenn da mal jemand drüber gehen könnte... Ich poste nur die wichtigsten Stellen.

testDLL.pb

Code: Alles auswählen

; == Enumerations ==
Enumeration
	#MT_Main
	#MT_Module
	#MT_Observer
EndEnumeration

; == Observer messages ==
Enumeration
	#M_addObserver
	#M_deleteObserver
EndEnumeration

; == Module messages ==

; == Main messages ==
Enumeration 
	#M_debug
EndEnumeration
;}

;{ == Structures ==
Structure sharedFunctions_struct
	; Communication functions
	*sendMessage
EndStructure

Structure moduleMessage_struct
	messageType.l
	message.l
	*argument
	flag.l
EndStructure
;}

; [...]

;{ == Global Things ==
Global *sharedFunctions.sharedFunctions_struct
Global tempString.s
;}

; [...]

;{ == Main Worker ==
ProcedureDLL Worker(*nullVar)
	;Wait to get the sharedFunctions
	Repeat : Delay(1) : Until *sharedFunctions <> #Null
	
	
	
	Define.moduleMessage_struct temp
	
	temp\messageType = #MT_Main
	temp\message = #M_debug
	
	tempString = "Successful loaded."
	;,PokeS()
	temp\argument = @tempString
	
	
	
	MessageRequester("DLL", "Send Message.")
	CallFunctionFast(*sharedFunctions\sendMessage, @temp)
EndProcedure
;}


testLoader.pb

Code: Alles auswählen

; == Enumerations ==
Enumeration
	#MT_Main
	#MT_Module
	#MT_Observer
EndEnumeration

; == Observer messages ==
Enumeration
	#M_addObserver
	#M_deleteObserver
EndEnumeration

; == Module messages ==

; == Main messages ==
Enumeration 
	#M_debug
EndEnumeration
;}

;{ == Structures ==
Structure sharedFunctions_struct
	; Communication functions
	*sendMessage
EndStructure

Structure moduleMessage_struct
	messageType.l
	message.l
	*argument
	flag.l
EndStructure
;}

; [...]

Procedure sendMessage(*message.moduleMessage_struct)
	MessageRequester("DEBUG", "In Message")
	Select *message\messageType
		Case #MT_Main
			MessageRequester("DEBUG", "MainCase")

;Hier schmiert der ab...
			MessageRequester("Catched Mainmessage", PeekS(*message\argument))
	EndSelect
EndProcedure

;[...]

Wäre echt genial wenn jemand wüsste wie ich den Fehler beheben könnte... Weil das Argument soll ein Zeiger bleiben, da es ja nicht nur Strings sondern auch mein ein Integer, Float, etc. sein soll. Je nach messageType halt...


MFG
Blackskyliner

Verfasst: 26.02.2009 22:25
von Thorium
Der Code ist nicht testbar.
Bitte so abändern das man ihn laufen lassen kann.

Verfasst: 26.02.2009 22:31
von Blackskyliner
Kein Problem hier das ganze Projekt

http://blacky.happyscripts.de/Downloads ... System.rar

<)

Verfasst: 26.02.2009 22:42
von Thorium
Das wirst du jetzt sicher nicht gerne lesen.
Aber funzt problemlos mit PB 4.30 auf meinem Rechner. :lol:

Ich bekomme den String korrekt übertragen und die MessageBox zeigt ihn mir an. Muss im Projekt natürlich noch Str durch PeekS ersetzen, wie in deinem Beispielcode.

Verfasst: 26.02.2009 22:54
von Blackskyliner
Immer diese Käfer in der Suppe <)

Jo,kann man nix machen wird wohl ein Bug in 4.2 sein also nun doch komplett umsteigen. Danke dir fürs Testen :allright: