Seite 1 von 1

DLLCall mit Xbase DLL

Verfasst: Fr, 29. Mär 2024 16:20
von klammerauf
Hm, etwas schwierig zu erklären.

Ich kann in der Umgebung, in der ich arbeite, Code nur über Codeblocks programmieren. Es gibt also ein Xbase++ Programm, das mir die Möglichkeit bietet, diversen Code als Codeblocks auszuführen. Innerhalb eines solchen Codeblocks will ich jetzt per DLLCall() auf eine Xbase++ DLL zugreifen.

Jetzt die Frage: muss diese DLL im Xbase++ Programm mitcompiliert werden, damit ich im Codeblock darauf zugreifen kann?

Folgefrage: wenn das ohne "Mitcompilierung" gehen sollte, muss die DLL dann mit der gleichen Version von Xbase++ compiliert worden sein?

Wir können das auch an einem Beispiel festmachen. Ich will z.B. die XbPCRE von Phil Ide verwenden. Die DLL wurde wohl mit 1.80.284 compiliert. Kann ich die dann per DLLCall() in einem Codeblock eines Xbase++ Programms aufrufen, das mit 1.90.irgendwas compiliert wurde?

Re: DLLCall mit Xbase DLL

Verfasst: Fr, 29. Mär 2024 17:34
von Tom
Jetzt die Frage: muss diese DLL im Xbase++ Programm mitcompiliert werden, damit ich im Codeblock darauf zugreifen kann?
Das macht man meistens so, linkt also die zur DLL miterzeugte LIB und hat dann automatisch Zugriff auf alle Funktionen daraus. Aber mit Xbase++ erzeugte DLLs lassen sich auch über DllCall() aufrufen. So steht es in der Hilfe:

Xbase++ DLLs
If a DLL file is created by Xbase++, all data types may be passed to a DLL function and can be processed by it. Executing a DLL function from an Xbase++ DLL is possible using DllCall(). However, it is recommended to use the macro-operator in this case, since it provides the fastest possible way to call a function contained in a dynamically loaded Xbase++ DLL.


Das habe ich, um ehrlich zu sein, noch nie probiert. Ob das auch versionsübergreifend funktioniert, wage ich allerdings zu bezweifeln, weil Xbase++ fast immer seine Runtimes benötigt, und das müssen dann die richtigen sein.

Re: DLLCall mit Xbase DLL

Verfasst: Di, 02. Apr 2024 13:12
von jbertram
// Hier ein Beispiel des aufrufs einer externen Windows-Dll per Codeblock
xdocname:="test.pdf"
cfindexe:=space(200)
result:=0
// Hier ein beispiel, als codeblock ausfürhbar
eval({||result:=DllCall( "SHELL32.DLL" , 32,"FindExecutableA", xdocname,"",@cfindexe)})
//numerisches ergebnis in result, named des exes in cfindexe

Re: DLLCall mit Xbase DLL

Verfasst: Di, 02. Apr 2024 17:25
von AUGE_OHR
wenn es sich um eine Xbase++ DLL handelt benötigt sie die entsprechende Runtime Version (__This_DLL_needs_versionxx_xx_xxx steht in der DLL)
wenn es sich um eine externe DLL handelt, die nicht mit Xbase++ erstellt wurde, ist es kein Problem die per Codeblock aufzurufen

die XbPCRE von Phil Ide wird sich nicht aufrufen lassen weil die mit einen älteren Xbase++ Version erstellt wurde und dafür die entsprechende Runtime benötigt wie Tom schon sagte.
du musste den Source von XbPCRE neu compilieren und eine neue Xbase++ DLL erstellen