DLLCall mit Xbase DLL

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 69
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

DLLCall mit Xbase DLL

Beitrag 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?
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DLLCall mit Xbase DLL

Beitrag 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.
Herzlich,
Tom
jbertram
Rookie
Rookie
Beiträge: 12
Registriert: Mo, 02. Okt 2006 17:22
Wohnort: Kelkheim

Re: DLLCall mit Xbase DLL

Beitrag 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: DLLCall mit Xbase DLL

Beitrag 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
gruss by OHR
Jimmy
Antworten