Disphelper.DLL

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten

Display Helper

finde ich interessant
1
33%
interessiert mich nicht
0
Keine Stimmen
ich mache nichts mit activeX oder DLL
0
Keine Stimmen
ich verstehe das nicht
2
67%
 
Insgesamt abgegebene Stimmen: 3

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

Disphelper.DLL

Beitrag von AUGE_OHR »

hi,

von Pablo Botella habe ich einen Tip bekommen http://sourceforge.net/projects/disphelper/
wer sich dafür interessiert sollte sich den Thread im Ordner "xfree.public" von Pablo ansehen ( "news.xbwin.com" )
Pablo hat geschrieben:I think we have just another usefull tool that can save situations where Alaska's IDispatch support is not handling a method as you expect or just when you think will be the most easy way. I love the automatic release when need to traverse objects.
:)
Zuletzt geändert von AUGE_OHR am Di, 05. Apr 2011 6:06, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
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: Disphelper.DLL

Beitrag von AUGE_OHR »

hi,

ich habe nun den Source mit DispHpr.DLL ausprobiert:

Xbase++ und o:CreateObject()
26.98 Sec. for 100 Records
0.2698 Records per Sec.
0.0170 Sec. per ActiveX Calls
0 ActiveX Calls fail

Xbase++ und DispHpr.DLL
5.59 Sec. for 100 Records
0.0559 Records per Sec.
0.0035 Sec. per ActiveX Calls
0 ActiveX Calls fail

es handelt sich hierbei um die Outlook Calender -> DBF Import Routine per MAPI.
gruss by OHR
Jimmy
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: Disphelper.DLL

Beitrag von AUGE_OHR »

hi,

wenn ich in die DBF (wird angelegt) sehe hab ich ein "Problem"

Code: Alles auswählen

#include "ot4xb.ch"
// ---------------------------------------------------------------------------
#xtranslate @dh:<f>( [<params,...>] )   => @disphpr:<f>( [<params>] )
// ---------------------------------------------------------------------------
#xtranslate SAFE_RELEASE( <v> ) => (<v> := iif(Empty(<v>),0,(IFpQCall(2,"__sl__sl",<v>),0)))
                                 ;
// ---------------------------------------------------------------------------
#xtranslate HR_TRY(<exp>) => iif( <exp> \< 0,(QOut("Fatal Error On Line ",__LINE__),Break()),)
// ---------------------------------------------------------------------------
#xtranslate L(<c>)  => cSzAnsi2Wide(<c>)



cText  := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
ccText := "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"

HR_TRY( @dh:dhGetValue(L("%s"),;
        @cText                ,;
        oItem                 ,;
        L(".Subject")))

*ccText := I2bin(cText)
*ccText := L2bin(cText)
*ccText := U2bin(cText)

*ccText := Bin2i(cText)
*ccText := Bin2l(cText)
*ccText := Bin2u(cText)

*ccText := W2bin(cText)
*ccText := Bin2w(cText)

*ccText := Bin2Var(cText)
*ccText := Var2Bin(cText)
cText gibt mir nur 4 "Zeichen" :(
ich habe dann wie ihr seht alle möglichen "binären" Function ausprobiert ... nix :banghead:

alles andere funktioniert ... Objecte, Methode(n) und bei den Property geht Type "D", "N" und "L" ... aber kein "C" ... :angry5:

es gibt zwar bei Display Helper noch mehr Variabel Typen
%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
aber auch mit denen bin ich nicht weiter gekommen.

startet doch mal das Demo (benötigt Outlook Calender) und seht es euch in der DBF an.
Bei "Subject" stehen noch viele "AAAA" mit drin, aber es geht nur um die ersten 4 Zeichen wie auch in den anderen Feldern Type "C"
Dateianhänge
DBF4BYTE.ZIP
DispHpr.DLL Demo Problem "String"
erfordert Outlook Calender Daten
(67.81 KiB) 307-mal heruntergeladen
gruss by OHR
Jimmy
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: Disphelper.DLL

Beitrag von AUGE_OHR »

hi,

hier nun die Lösung von Pablo

Code: Alles auswählen

p := 0
HR_TRY( @dh:dhGetValue(L("%s"), @p,oItem,L(".Subject")))
cText := PeekStr(p,,-1)
@oleaut32:SysFreeString(p)
der String ist übrigens ANSI.
gruss by OHR
Jimmy
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: Disphelper.DLL

Beitrag von AUGE_OHR »

@ich verstehe das nicht

Xbase++ hat seit der Version v1.9.331 activeX "eingebaut".

leider hat die Umsetzung von Alaska 2 grundsätzliche Probleme :

1.) es funktionieren nur Object die mit IDispatch arbeiten
2.) es ist unheimlich "langsam" ...

die DispHpr.DLL tut nun genau das selbe wie Xbase++ o:CreateObject() aber :

1.) es funktionieren auch Object die mit IUnknown arbeiten
2.) es ist um 400-500% "schneller"

der Grund warum ich überhaupt Pablo gefragt habe lag an Xbase++ o:treatDateAsString( .T. ) welche "nur" YYYYMMDDHHMMSS ergibt und die Dezimal Stellen fehlen.
"dummerweise" wird dabei anscheinend die "letzte" Sekunde "gerundet" so das eine "eindeutige" Identifizierung nicht möglich ist.

Mit der DispHpr.DLL und viel Hilfe von Pablo habe ich das Problem nun lösen können.

Code: Alles auswählen

#include "ot4xb.ch"

#xtranslate @dh:<f>( [<params,...>] )   => @disphpr:<f>( [<params>] )
#xtranslate L(<c>)  => cSzAnsi2Wide(<c>)

PROCEDURE TEST
LOCAL oFt := FileTime64():New()

// cStringStart := oItem:treatDateAsString( .T. ):getProperty( "Start")

if(@dh:dhGetValue(L("%f"),;
   @oFt,;
   oItem,;
   L(".Start")) >= 0 )
   cStringStart:=oFt:_GetTimeStamp_("%04.4hu%02.2hu%02.2hu%02.2hu%02.2hu%02.2hu.%03.3hu")
else
     // ? "failed"
end
Ergebniss ist dann YYYYMMDDHHMMSS.ccc wobei es um 1/1000 Sec differieren kann.
Es ist aber immer noch um den Faktor 100 "genauer" als Xbase++ und für activeX benötigt Xbase++ eh ca. 19/100 Sec.
gruss by OHR
Jimmy
Benutzeravatar
Pablo Botella
Rookie
Rookie
Beiträge: 14
Registriert: Do, 18. Dez 2008 20:14
Wohnort: Santiago de Compostela - Spain
Kontaktdaten:

Re: Disphelper.DLL

Beitrag von Pablo Botella »

Hallo Jimmy,
AUGE_OHR hat geschrieben: die DispHpr.DLL tut nun genau das selbe wie Xbase++ o:CreateObject() aber :
1.) es funktionieren auch Object die mit IUnknown arbeiten
uhmmm, falsche

DispHpr as the name suggest is just a helper to use IDispatch::invoke() and has no support to call other methods directly using the VTBL pointer.
DispHpr wie der Name ist nur ein Helfer, IDispatch::invoke() zu verwenden und hat keine Unterstützung für andere Methoden direkt über VTBL Zeiger aufrufen.

However not all lost as ot4xb provide the IFpCall() function to call methods just using the VTLB from IUnknown
Jedoch nicht alle verloren wie ot4xb stellen Sie die IFpCall()-Funktion aufrufen, nur mit der VTLB von IUnknown

Grüße,
Pablo
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: Disphelper.DLL

Beitrag von AUGE_OHR »

Pablo Botella hat geschrieben:uhmmm, falsche
uuuups ... Sorry :notworthy:
Pablo Botella hat geschrieben:DispHpr as the name suggest is just a helper to use IDispatch::invoke() and has no support to call other methods directly using the VTBL pointer.
DispHpr wie der Name ist nur ein Helfer, IDispatch::invoke() zu verwenden und hat keine Unterstützung für andere Methoden direkt über VTBL Zeiger aufrufen.

However not all lost as ot4xb provide the IFpCall() function to call methods just using the VTLB from IUnknown
Jedoch nicht alle verloren wie ot4xb stellen Sie die IFpCall()-Funktion aufrufen, nur mit der VTLB von IUnknown
ok i "think" i begin to understand.

Thx again for Display Helper Tip and all your Help you give me. :thumbright:
gruss by OHR
Jimmy
Antworten