Purebasic DLL und Windows XP

Für allgemeine Fragen zur Programmierung mit PureBasic.
ingo
Beiträge: 11
Registriert: 19.03.2005 15:23

Purebasic DLL und Windows XP

Beitrag 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
Ein Computer gehorcht Deinen Befehlen, nicht Deinen Absichten!
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

> Was mache ich da falsch?
Öhm, was du falsch machst? Source nicht raus rücken z.b.
Bild
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 »

Vielleicht sorgste dafür, der der Pfad deiner Anwendung auch zum CurrentDir wird :mrgreen:
Für den Rest gibts ne Suchfunktion
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
ingo
Beiträge: 11
Registriert: 19.03.2005 15:23

Beitrag 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
Ein Computer gehorcht Deinen Befehlen, nicht Deinen Absichten!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
ingo
Beiträge: 11
Registriert: 19.03.2005 15:23

Beitrag 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
Ein Computer gehorcht Deinen Befehlen, nicht Deinen Absichten!
Antworten