Seite 1 von 1

Purebasic DLL und Windows XP

Verfasst: 10.06.2006 18:58
von ingo
Hallo Leute,
ich habe da ein Problem, ich habe mit PB 3.94 eine DLL geschrieben. Diese wird im Verzeichniss des zugehörigen Programms gespeichert.
Wenn ich das ganze unter ME laufen lasse funzt es. Wenn es unter XP gestartet wird, dann bleibt die Anwendung stecken. Es rührt sich nichts.

Ich dache es liegt an einer Procedure in der DLL, da diese ein Window auf dem Desktop produziert. War es aber nicht. Sobald man die DLL öffnet, bleibt das Programm hängen.

Was mache ich da falsch?

Danke für die Hilfe!
GRUSS
INGO

Verfasst: 10.06.2006 19:20
von MVXA
> Was mache ich da falsch?
Öhm, was du falsch machst? Source nicht raus rücken z.b.

Verfasst: 10.06.2006 20:57
von ts-soft
Vielleicht sorgste dafür, der der Pfad deiner Anwendung auch zum CurrentDir wird :mrgreen:
Für den Rest gibts ne Suchfunktion

Verfasst: 10.06.2006 21:28
von ingo
Hallo,
ich habe soeben den Fehler gefunden. Innerhalb einer DLL kann man unter XP keine Array´s als Global deklarieren!!! Man muss sie als Struktur verpacken!! Bei ME/98 geht das noch!

GRUSS
INGO

Verfasst: 10.06.2006 21:36
von Kaeru Gaman
wenn du das noch präziser benennen kannst wird das ein supertip!

schau mal, dass du ne allgemeingültige aussage dazu hinbekommst,
dann wär das Tips&Tricks-würdig.. :allright:

Verfasst: 11.06.2006 10:09
von ingo
Hallo,
Du hast Recht, vielleicht ist das eine gute Idee, aber bevor ich es bei Tips und Tricks einstelle, sollten wir mal testen ob ich nur einen Nagel im Kopf habe, oder es an meiner Maschine liegt.

Also versuch.dll und versuch_DLL_starten laufen auf meinem Noteboock mit Win ME föllig klaglos!
Wenn ich den Versuch unter XP mache, dann bleibt das Programm versuch_DLL_starten hängen!!! Auch im PB-Compiler! In der IDE steht nur "Executable gestartet" danach rührt sich nix mehr bis man das Programm anhält.
IDE und Compiler sowie alle anderen Anwendungen laufen weiter!


Ändere ich nun den Code in der DLL (so_geht_es_dann) läuft es auch unter XP.

Wer möchte kann es ja mal testen ob er die gleiche Fehler erscheinung hat. Damit man testen kann hier noch die Eckdaten: PB 3.94 XP SP2 Compiler: debugger eingeschaltet, XP Skin-Unterstützung eingeschaltet, Alle CPU´s

Diese beiden laufen bei mir nur unter ME:
versuch.dll

Code: Alles auswählen

Dim wert_feld.w(10)

ProcedureDLL Versuch_Funktion_1(wert.w, position.w)
    wert_feld(position) = wert
    MessageRequester("Hallo", "Der Wert: "+Str(wert)+" wurde an die Position: " + Str(position) + " eingetragen", 0)
EndProcedure

ProcedureDLL.w Versuch_Funktion_2(position.w)
	wert.w = wert_feld(position)
	ProcedureReturn wert
EndProcedure
verusch_dll_starten.pb

Code: Alles auswählen

If OpenLibrary(0, "D:\Basic\Projekte\testareal\versuch.dll")
    CallFunction(0, "Versuch_Funktion_1", 100, 3)
		Delay (1000)
		ergebnis.w = CallFunction(0, "Versuch_Funktion_2", 3)
    Debug ergebnis
    CloseLibrary(0)
Else
	MessageRequester("FEHLER","DLL konnte nicht geöffnet werden!",0)
EndIf
Diese beiden laufen bei mir unter XP und ME
so_geht_es_dann.dll

Code: Alles auswählen

Structure array
  wert_feld.w[10]
EndStructure

Global feld.array

ProcedureDLL Versuch_Funktion_1(wert.w, position.w)
    feld\wert_feld[position] = wert
    MessageRequester("Hallo", "Der Wert: "+Str(wert)+" wurde an die Position: " + Str(position) + " eingetragen", 0)
EndProcedure

ProcedureDLL.w Versuch_Funktion_2(position.w)
	wert.w = feld\wert_feld[position]
	ProcedureReturn wert
EndProcedure
so_geht_es_dann_dll_starten.pb

Code: Alles auswählen

If OpenLibrary(0, "D:\Basic\Projekte\testareal\so_geht_es_dann.dll")
    CallFunction(0, "Versuch_Funktion_1", 100, 3)
		Delay (1000)
		ergebnis.w = CallFunction(0, "Versuch_Funktion_2", 3)
    Debug ergebnis
    CloseLibrary(0)
Else
	MessageRequester("FEHLER","DLL konnte nicht geöffnet werden!",0)
EndIf
GRUSS
Ingo