callback procedure in Exe

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: callback procedure in Exe

Beitrag 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 
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
HPW
Beiträge: 17
Registriert: 30.08.2004 17:32

Re: callback procedure in Exe

Beitrag 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
Zuletzt geändert von HPW am 14.10.2018 17:05, insgesamt 1-mal geändert.
Hans-Peter
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: callback procedure in Exe

Beitrag 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/
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
HPW
Beiträge: 17
Registriert: 30.08.2004 17:32

Re: callback procedure in Exe

Beitrag 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,
Hans-Peter
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

Re: callback procedure in Exe

Beitrag 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 :)
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
HPW
Beiträge: 17
Registriert: 30.08.2004 17:32

Re: callback procedure in Exe

Beitrag 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
Hans-Peter
Antworten