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 ;)