Seite 2 von 2

Re: callback procedure in Exe

Verfasst: 14.10.2018 14:15
von mk-soft
Das hier funktioniert...

Code: Alles auswählen

;-TOP

; *******************************************************************

; -------------------------------------------------------------------

Prototype newLispEvalStrProto(EvalStr.p-utf8)
Prototype newlispCallbackStrProto(input.p-utf8, callbackaddress.i , calltype.p-utf8 )

Global _newLispEvalStr.newLispEvalStrProto
Global newlispCallbackStr.newlispCallbackStrProto 
Global newlispLib

; -------------------------------------------------------------------

Procedure InitNewLisp() 
    
  newlispLib = OpenLibrary(#PB_Any,"newlisp.dll")
  If newlispLib
    _newLispEvalStr = GetFunction(newlispLib,"newlispEvalStr") 
    newlispCallbackStr = GetFunction(newlispLib, "newlispCallback")
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

; -------------------------------------------------------------------

Procedure.s newLispEvalStr(EvalStr.s)
  Protected *result, result.s
  
  *result = _newLispEvalStr(EvalStr) 
  If *result
    result = PeekS(*result, -1, #PB_UTF8)
  Else
    result = "Error: No result"
  EndIf
  ProcedureReturn result
EndProcedure

; *******************************************************************

Global result.s, evalstr.s, r1

; -------------------------------------------------------------------

Procedure callme(*Info)
  Protected text.s
  If *Info
    text = PeekS(*info, -1, #PB_UTF8)
    ProcedureReturn MessageRequester("newLisp", "Result = " + text, #PB_MessageRequester_YesNoCancel)
  Else
    ProcedureReturn MessageRequester("newLisp", "No Info")
  EndIf
EndProcedure

; -------------------------------------------------------------------

If InitNewLisp()
  
  evalstr = "(callme 'Hello world')"
  evalstr = ReplaceString(evalstr, "'", #DQUOTE$)
  
  r1 = newlispCallbackStr("callme", @callme(), "stdcall")
  If r1
    result.s = newLispEvalStr(evalstr) 
    Debug "result = " + result
  Else
    Debug "Error: Register Callback"
  EndIf 
EndIf 

Re: callback procedure in Exe

Verfasst: 14.10.2018 15:03
von HPW
Hallo mk-soft,

Danke für deine Mühe. Aufgrung deines ersten Hinweisses sind bei mir aber auch schon die richtigen Ideen gekommen.

Und nochmals Danke an alle anderen die dazu beigetragen haben.

Anbei das komplette Projekt mit der Dll (32bit):

http://www.hpwsoft.de/anmeldung/html1/n ... isp_PB.zip

Screenshot:

Bild

Grüsse,

Hans-Peter

Re: callback procedure in Exe

Verfasst: 14.10.2018 16:33
von mk-soft
Deine "newlisp_utf8.dll" ist wohl alt und das Programm schmiert ohne debugger ab

Mit der aktuellen DLL "newlisp.dll" funktioniert es...

Link: http://www.newlisp.org/downloads/

Re: callback procedure in Exe

Verfasst: 14.10.2018 16:52
von HPW
Hallo,

Also die Dll ist schon aktuell, aber kann es sein das du eine 64 bit Version hast?
Ich hatte nicht erwähnt, das ich noch auf 32 bit bin. Damit wäre das erklärt.
Wäre aber gut zu wissen das es mit der 64bit Paarung auch läuft! :)

Grüsse,

Re: callback procedure in Exe

Verfasst: 14.10.2018 17:34
von ts-soft
Eine 64-Bit DLL nutzt immer Fastcall Konventionen, so das zwischen Prototype und PrototypeC nicht unterschieden werden muss.
Eine 32-Bit DLL nutzt entweder StdCall (Prototype) oder CDECL (PrototypeC).

Ohne das ganze zu probieren, vermute ich mal das dies der Fehler ist :)

Re: callback procedure in Exe

Verfasst: 17.10.2018 19:06
von HPW
Hallo,

Update für das demo mit 2 weiteren Callbacks mit Integer and Double parameter.

Hier nochmal die komplete purebasic source mit der newlisp utf8 dll (32 bit):
Diesmal auch die compilierte Demo mit 52224 Bytes.

http://www.hpwsoft.de/anmeldung/html1/n ... isp_PB.zip

Grüsse,
Hans-Peter