ActveX schneller mit ot4xb?

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

ActveX schneller mit ot4xb?

Beitrag von satmax »

Hallo Jimmy,
AUGE_OHR hat geschrieben:
satmax hat geschrieben:Das mit ActivX und LANGSAM verunsichert mich nun.
unabhänig von anderen Sprachen gibt es auch unter Xbase++ mit Hilfe von ot4xb eine Möglichkeit die Geschwindigkeit um Faktor 40 zu beschleunigen. Anfragen dazu bitte in einem neuen Thread.
Gruß
Markus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: ActveX schneller mit ot4xb?

Beitrag von AUGE_OHR »

in der aktuellen Version 1.6.0.167 gibt es die Disphelper Functionen für den Umgang mit COM Objekten.
http://disphelper.sourceforge.net/readme.htm
Pablo hat nun folgenden Function daraus gemacht.

_DH_CREATEOBJECT
_DH_GETOBJECT
_DH_CREATEOBJECTEX
_DH_GETOBJECTEX
_DH_CALLMETHOD
_DH_PUTVALUE
_DH_PUTREF
_DH_GETVALUE
_DH_INVOKE
_DH_INVOKEARRAY
_DH_CALLMETHODV
_DH_PUTVALUEV
_DH_PUTREFV
_DH_GETVALUEV
_DH_INVOKEV
_DH_ENUMBEGIN
_DH_ENUMBEGINV
_DH_ENUMNEXTOBJECT
_DH_ENUMNEXTVARIANT
_DH_TOGGLEEXCEPTIONS

vergleicht man die Demo Beispiele die o.g. URL und nimmt z.b. das Excel Beispiel dann ergibt sich folgenden Syntax

C :
dhCreateObject(L"Excel.Application", NULL, &xlApp)

alt DispHPR.DLL :
#xtranslate @dh:<f>( [<params,...>] ) => @disphpr:<f>( [<params>] )
#xtranslate L(<c>) => cSzAnsi2Wide(<c>)
@dh:dhCreateObject(L("Excel.Application"),0,@xlApp)

neu Ot4xb.DLL :
#xtranslate L(<c>) => cSzAnsi2Wide(<c>)
_dh_CreateObject(L("Excel.Application"),0,@xlApp)

statt eines Object bekommt man in xlApp einen numerischen Wert ( Pointer / Handle )
da die Variable per Referenz übergeben wird kann man keine Class iVar benutzten

_dh_...( @::MyIvar) -> Error

_dh_...( @Mylocal ) -> funktioniert
::MyIvar := Mylocal // jetzt in die Ivar


Property abfragen/setzen :

_dh_PutValue(xlApp, L(".DisplayFullScreen = %b"), .T.)
_dh_PutValue(xlApp, L(".Visible = %b"), .T.)

_dh_GetValue(L("%o"),@xlRange,xlApp,L(".ActiveSheet.Range(%s)"), "A1:E2")
_dh_GetValue(L("%o"),@xlChart,xlApp,L(".ActiveWorkbook.Charts.Add"))

von Xbase++ sind wir verwöhnt was die Definition von Variabel angeht.
auf API Ebene muss man den Type angeben wobei der C printf Style verwendet wird.

%d LONG long, int, INT
%u ULONG unsigned long, unsigned int, UINT, DWORD
%e DOUBLE double
%b BOOL
%v VARIANT
%B BSTR 1
%s LPSTR char * 1
%S LPWSTR WCHAR * 1
%T LPTSTR TCHAR * 1
%o IDispatch * DISPATCH_OBJ(var) 2, 3
%O IUnknown * 3
%t time_t 4
%W SYSTEMTIME * 4
%f FILETIME * 4
%D DATE 4
%p LPVOID Use for HANDLEs, HWNDs, etc
%m Missing Argument 5


Method ausführen

// Apply a border around everything. Note '%m' means missing.
_dh_CallMethod(xlSheet, L(".Range(%s).BorderAround(%d, %d, %m, %d)"), "A1:E2", 1, 2,0)

// Set up the chart
_dh_CallMethod( xlChart, L(".ChartWizard(%o, %d, %d, %d, %d, %d, %b, %s)"),;
xlRange,-4100, 7, 1, 1, 0,.F.,"Critically Endangered Plants and Animals")

und am Ende aufräumen

am Ende müssen noch alle Pointer freigegeben werden

#xtranslate SAFE_RELEASE( <v> ) => (<v> := iif(Empty(<v>),0,(IFpQCall(2,"__sl__sl",<v>),0)))
SAFE_RELEASE(xlRange)
SAFE_RELEASE(xlChart)
SAFE_RELEASE(xlApp)

weitere Anfrage im Zweifel in der Newsgroup von Pablo stellen news.xbwin.com oder über http://www.Xbwin.com -> Forum da es sich ja nicht um pure Xbase++ handelt.
gruss by OHR
Jimmy
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: ActveX schneller mit ot4xb?

Beitrag von satmax »

Vorerst herzlichen Dank Jimmy. Ich werde mir das noch genauer ansehen.
Gruß
Markus
Antworten