Seite 2 von 2

Re: LIBXL: ohne fpqcall und ot4xb möglich ?

Verfasst: So, 21. Mär 2021 6:26
von ramses
brandelh hat geschrieben: So, 21. Mär 2021 1:47 Ich verstehe nicht warum es nicht gehen sollte, eine Funktion in der eigenen EXE oder Xbase++ DLL aufzurufen ???
Entweder ich starte die direkt im Quellcode oder über ein Macro :? Was übersehe ich ?
Hallo Hubert

du hast übersehen dass es nicht "Das nicht geht" ist sondern dass die Performance übers Makro derart schlecht ist dass sich dieser Weg aus Performance Gründen bei vielen solchen Aufrufen gleich selbst verunmöglicht .....

els

Verfasst: So, 21. Mär 2021 11:40
von Marcus Herz
Mann kann mit dem Makro Operator direkt Funtkionen aufrufen, die mitgelinkt sind!

Code: Alles auswählen

if IsFunction("cFunc")
&(cFunc)(paramer liste)   // ohne Codeblock
Das ist laut einem Gespräch auf einer der Devcons mit dem Alaska Team sogar ein schneller Aufruf, weil der direkt über die Funktionstabelle geht. Und der Linker mosert nicht wegen unbekannten Funktionen.

zu EXTERN:
Eine solche Deklaration macht ja nur Sinn, wenn ich schon vor dem Linken die Typen der Parameter kenne, also dass ich die Funktion unterstütze. Funktionen, welche ich erst während der Laufzeit identifiziere, muss ich mit DLLFUNKTION aufrufen:

Code: Alles auswählen

STATIC sApi:=NIL
LOCAL uRet
	if IsNil(sApi)
		sApi := DllPrepareCall( <dllname>, DLL_STDCALL, cFunc)
	endif
	uRet := DllExecuteCall(sApi, p1, p2, p3,......)
Das dürfte am Ende sich nicht viel von Ot4Xb unterscheiden (kennen den Code leider nicht), aber die technischen Rahmenbedingungen sind ja die selben. Ich weiß nicht, ob Ot4Xb die Typen der Parameter erkennen kann, dazu bräuchte es ja die LIB dazu. Ist im Normalfall wahrscheinlich auch kein Problem, weil ja alle Parameter auf C- Ebene 32bit Pointer sind. DIe aufgerufene Funktion weiß, was sich dahinter verbirgt: ein Integer oder ein Pointer auf eine Zeichenkette.
Man kann obige Funktion ja dahingehend erweitern, das man ein Array mit den Templates führt, um den 2. Aufruf zu beschhleunigen:

Code: Alles auswählen

FUNC DynCall(cDll, cFunc )
STATIC aTemplate := {}
LOCAL uRet
LOCAL nPos
     if (nPos := ascan(aTemplate, {|a| a[1] == cFunc})) = 0
     	aadd( aTemplate, {cFunc,  DllPrepareCall( <dllname>, DLL_STDCALL, cFunc)})
     	nPos	:= len(aTemplate)
     endif
     if pcount() = 3
	uRet := DllExecuteCall(aTemplate[nPos,2], pValue(3))
    elseif pcount() = 3
	uRet := DllExecuteCall(aTemplate[nPos,2], pValue(3), pvlaue(4))
	....
	endif
return uRet
	

Re: LIBXL: ohne fpqcall und ot4xb möglich ?

Verfasst: So, 21. Mär 2021 11:58
von brandelh
ramses hat geschrieben: So, 21. Mär 2021 6:26
brandelh hat geschrieben: So, 21. Mär 2021 1:47 Ich verstehe nicht warum es nicht gehen sollte, eine Funktion in der eigenen EXE oder Xbase++ DLL aufzurufen ???
Entweder ich starte die direkt im Quellcode oder über ein Macro :? Was übersehe ich ?
Hallo Hubert

du hast übersehen dass es nicht "Das nicht geht" ist sondern dass die Performance übers Makro derart schlecht ist dass sich dieser Weg aus Performance Gründen bei vielen solchen Aufrufen gleich selbst verunmöglicht .....
OK - das kann ich verstehen, ist aber

1. wohl ein Sonderfall, und ...
2. lautet die Überschrift LIBXL ohne ot4xb möglich ... daher meine Verwirrung.

Re: LIBXL: ohne fpqcall und ot4xb möglich ?

Verfasst: Mo, 22. Mär 2021 11:49
von Frank Grossheinrich
Tom hat geschrieben: Mo, 22. Feb 2021 16:20 Ja, mit EXTERN ist einiges besser geworden, aber wenn man einen Pointer zurückbekommt (wie z.B. von QPDF), muss man doch noch mit ot4xb peeken.
Dann seid gespannt auf das nächste Update! Das kümmert sich SEHR STARK um EXTERN! Und ergänzt hoffentlich alles, was noch so gefehlt hat.

Grüße, Frank

Re: LIBXL: ohne fpqcall und ot4xb möglich ?

Verfasst: Mo, 22. Mär 2021 15:46
von Werner_Bayern
Servus Frank,

löst das dann auch mein Problem mit AssocQueryString? Wobei hier aber vermutlich der Fehler bei mir liegt :wink:

Re: els

Verfasst: Fr, 26. Mär 2021 11:01
von ramses
Marcus Herz hat geschrieben: So, 21. Mär 2021 11:40 Mann kann mit dem Makro Operator direkt Funtkionen aufrufen, die mitgelinkt sind!

Code: Alles auswählen

if IsFunction("cFunc")
&(cFunc)(paramer liste)   // ohne Codeblock
Hallo Markus

den kannte ich nicht! Auf die Idee nach dem Macro in Klammern die Parameter für die Funktion im Macro zu setzten wäre ich nie gekommen und habe es damals auch nie versucht oder nie irgendwo gelesen.

Es funktioniert in der Tat und einiges Schneller als der Weg über den Macro / Codeblock Weg.

Danke für den Tip.

Re: LIBXL: ohne fpqcall und ot4xb möglich ?

Verfasst: Fr, 26. Mär 2021 13:27
von Frank Grossheinrich
löst das dann auch mein Problem mit AssocQueryString? Wobei hier aber vermutlich der Fehler bei mir liegt :wink:
Servus Werner,

ehhhmmm, und was war/ist dein Problem?
Was wir leider NICHT implementiert haben ist "Fix all problems". Sorry.

:)
Grüße, Frank

Re: LIBXL: ohne fpqcall und ot4xb möglich ?

Verfasst: Fr, 26. Mär 2021 14:18
von Werner_Bayern
Servus Frank,

da hatte ich Dir eine Mail geschickt.

"Fix all problems" - Gibt's dafür nicht einen Schalter? Einfach von false auf true setzen? :)