Seite 1 von 2
auslesen einer dll mit peeks()
Verfasst: 22.05.2007 22:33
von Tsuki-Namida
ich verstehe leider nicht warum in dieser zeile:
PeekS(CallFunction(3, "GetMessage", GetGadgetText(1)))
die fehler meldung:
[ERROR] Specified address is null!
erscheint...
was ist falsch???
hier der ganze quelltext
Code: Alles auswählen
If OpenWindow(0,0,0,50,50,"version.dll Demo",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) And CreateGadgetList(WindowID(0))
StringGadget(1,0,0,100,20,"Versionsnummer")
ButtonGadget(2,0,22,100,25,"Senden")
EndIf
OpenLibrary(3, "version.dll")
Repeat
Event = WaitWindowEvent()
WindowID = EventWindow()
GadgetID = EventGadget()
EventType = EventType()
If Event = #PB_Event_Gadget
If GadgetID = 2
AktuelleVersion$ = PeekS(CallFunction(3, "GetVersions", GetGadgetText(1)))
VersionsMessage$ = PeekS(CallFunction(3, "GetMessage", GetGadgetText(1)))
MessageRequester("Versionsnummer", "Die Aktuelle Versionsnummer ist: " + AktuelleVersion$)
MessageRequester("Versionsmessage", VersionsMessage$)
End
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
Verfasst: 22.05.2007 22:40
von edel
Sieht wohl so aus als ob Callfunction null zurueck gibt.
Verfasst: 23.05.2007 08:30
von Tsuki-Namida
das ist ja das was ich nciht verstehe...
hier ist noch der quelltext der dll
Code: Alles auswählen
ProcedureDLL.s GetVersions(ProgrammVersion$)
a$=Space(#MAX_PATH)
x=GetTempPath_(Len(a$),@a$)
b$=PeekS(@a$)
If Right(b$,1)<>"\":b$+"\":EndIf
Download$ = "http://chesudia.rmxp.de/version.php?ver="+ProgrammVersion$
Debug Download$
URLDownloadToFile_(0, Download$, b$+"temp.000", 0, 0)
Delay(100)
If OpenFile(1,b$+"temp.000")
While Eof(1) = 0
T$ = ReadString(1)
If FindString(T$,"<br/>",1)
Version$ = RemoveString(T$,"<br/>")
EndIf
Wend
CloseFile(1)
DeleteFile(b$+"temp.000")
ProcedureReturn Version$
Else
ProcedureReturn "ERROR -1"
EndIf
EndProcedure
ProcedureDLL.s GetMessage(ProgrammVersion$)
a$=Space(#MAX_PATH)
x=GetTempPath_(Len(a$),@a$)
b$=PeekS(@a$)
If Right(b$,1)<>"\":b$+"\":EndIf
Download$ = "http://chesudia.rmxp.de/version.php?ver="+ProgrammVersion$
URLDownloadToFile_(0, Download$, b$+"temp.000", 0, 0)
Delay(100)
If OpenFile(1,b$+"temp.000")
While Eof(1) = 0
T$ = ReadString(1)
T$ = ReadString(1)
Wend
CloseFile(1)
DeleteFile(b$+"temp.000")
ProcedureReturn T$
Else
ProcedureReturn "ERROR -1"
EndIf
EndProcedure
Verfasst: 23.05.2007 08:33
von a14xerus
Rückgabestrings müssen in einer DLL immer GLOBAL sein
Verfasst: 23.05.2007 11:09
von Tsuki-Namida
a14xerus hat geschrieben:Rückgabestrings müssen in einer DLL immer GLOBAL sein
sind sie denn nicht global???
ich habe schon einmal eine dll geschrieben und der string den ich erwartet habe habe ich auch erhalten....
ich weis nicht was du meinst....
meinst du fileicht das ich den string (in der DLL "T$") globalisieren?
Global T$
Verfasst: 23.05.2007 13:50
von a14xerus
Der String der aus der DLL zurückgegeben werden soll, muss vorher als Global deklariert sein.
Purebasic Hilfe hat geschrieben:Hinweise zur Rückgabe von Strings aus DLL's:
Bei der Rückgabe von Strings aus einer DLL-Funktion muß der String als Global deklariert sein.
Beispiel:
Code: Alles auswählen
Global ReturnString$
ProcedureDLL.s MyFunction(var.s)
ReturnString$ = var + " test"
ProcedureReturn ReturnString$
EndProcedure
Ohne die Deklaration als Global ist der String nur Lokal in der ProcedureDLL verfügbar und kann somit nicht außerhalb verwendet werden.
Verfasst: 23.05.2007 13:57
von Tsuki-Namida
ja das habe ich schon versucht... nur leider mit der selben fehlermeldung im programm...
hier noch mal die dll
Code: Alles auswählen
Global ReturnString$
ProcedureDLL.s GetVersions(ProgrammVersion$)
a$=Space(#MAX_PATH)
x=GetTempPath_(Len(a$),@a$)
b$=PeekS(@a$)
If Right(b$,1)<>"\":b$+"\":EndIf
Debug b$
Download$ = "http://chesudia.rmxp.de/version.php?ver="+ProgrammVersion$
Debug Download$
URLDownloadToFile_(0, Download$, b$+"temp.tm", 0, 0)
Delay(100)
If OpenFile(1,b$+"temp.tm")
While Eof(1) = 0
T$ = ReadString(1)
If FindString(T$,"<br/>",1)
Version$ = RemoveString(T$,"<br/>")
EndIf
Wend
CloseFile(1)
DeleteFile(b$+"temp.tm")
ReturnString$ = Version$
ProcedureReturn ReturnString$
Else
ReturnString$ = "ERROR -1"
ProcedureReturn ReturnString$
EndIf
EndProcedure
ProcedureDLL.s GetMessage(ProgrammVersion$)
a$=Space(#MAX_PATH)
x=GetTempPath_(Len(a$),@a$)
b$=PeekS(@a$)
If Right(b$,1)<>"\":b$+"\":EndIf
Download$ = "http://chesudia.rmxp.de/version.php?ver="+ProgrammVersion$
URLDownloadToFile_(0, Download$, b$+"temp.tm", 0, 0)
Delay(100)
If OpenFile(1,b$+"temp.tm")
While Eof(1) = 0
T$ = ReadString(1)
T$ = ReadString(1)
Wend
CloseFile(1)
DeleteFile(b$+"temp.tm")
ReturnString$ = T$
ProcedureReturn ReturnString$
Else
ReturnString$ = "ERROR -1"
ProcedureReturn ReturnString$
EndIf
EndProcedure
Verfasst: 23.05.2007 14:00
von a14xerus
mach mal callfunktion() und peeks() nicht in die selbe Zeile...
also:
tmp = callfunction(..)
peeks(tmp)
Ich glaube es zwar nicht bei diesem Error, aber es kann auch sein, das der Fehler in der DLL liegt, und dann zeigt der Debugger den Error immer in der Zeile an, wo die Procedure aus der DLL aufgerufen wurde
Verfasst: 23.05.2007 14:14
von Tsuki-Namida
okay ich habe es versucht....
temp = CallFunction(3, "GetVersions", GetGadgetText(1))
AktuelleVersion$ = PeekS(temp)
jetzt kommt der fehler in dieser zeile:
PeekS(temp)
alsp glaube ich nicht so richtig das es an der dll liegt...
Verfasst: 23.05.2007 14:41
von a14xerus
Ja war ja auch nur eine Idee, nich das es das nachher gewesen wäre, und wir rätseln hier rum
