Seite 1 von 1

Umsetzung eines VB-Beispiels nach xBase

Verfasst: Mi, 20. Sep 2006 14:42
von Lewi
Hi Folks,
Ich versuche folgenden VB-Code unter Verwendung eines ActiveX-Objektes in xBase umzusetzten:

Code: Alles auswählen

Private Function VB_Test()

DIM nCount As INTEGER = 0
DIM nRetCode as INTEGER = 0
DIM oObj as Object

Set oObj = CreateObject(“Vehicle.UsedVeh”)
nRetCode := oObj:GetCount( nCount )
MsgBox( “Anzahl: ” & nCount )

End Function
Die Funktion läuft unter VB einwandfrei.


Das oben genannte Beispiel habe ich in xBase wie folgt umgesetzt:

Code: Alles auswählen

Function XBase_Test()
Local oObj
Local nCount := 0
Local nRetCode := 0

oObj := CreateObject(“Vehicle.UseVeh”)
If oObj == NIL
	Msgbox(“Fehler”)
	Return ( NIL )
endif

nRetCode := oObj:GetCount( nCount ) // ->Dieser Aufruf erzeugt ein Laufzeit-Fehler!
MsgBox( Str( nCount )
Return ( NIL )
Der xbase-Code erzeugt an der dargelegten Stelle einen Laufzeitfehler mit dem Hinweis auf die Argumentenliste, den ich nicht verstehe.

Im VB-Beispiel wird der Parameter „nCount“ übergeben und gesetzt. Der Return-Code der Methode gibt einen Wert zurück, der angibt, ob der Methodenaufruf erfolgreich ausgeführt wurde. In VB wird der Parameter „nCount“ referenziert.

Die entsprechende Typ-Library zeigt für die Methode folgende Daten an:

Code: Alles auswählen

- GetCount
  ID=23
  FUNCID=PUREVIRTUAL
  INVOKEKIND=FUNC
  CALLCONV=CDECL
  FUNCFLAGS=
  OVFT=104
  CPARAMS=1
  CPARAMSOPT=0
         PARAMETERS
         -  aI_count
         -  TYPE=I*4
         -  SIZE=4
         -  PARAMFLAG=IN OUT

Meine Frage: Wie sollte der Methodeaufruf samt Parameter erfolgen?

Gruß,
Olaf

Re: Umsetzung eines VB-Beispiels nach xBase

Verfasst: Mi, 20. Sep 2006 16:50
von AUGE_OHR
hi,
Lewi hat geschrieben:

Code: Alles auswählen

nRetCode := oObj:GetCount( nCount )
... hmmm ... "nCount" ist doch = 0 ?

versuche es mal :

Code: Alles auswählen

nCount := oObj:callMethod( "GetCount") 
gruss by OHR
Jimmy

Verfasst: Mi, 20. Sep 2006 17:06
von Lewi
Hi Jimmy,
die Methode :GetCount( int*par ) gibt nicht die Anzahl zurück, sondern einen Return-Wert, mit dem festgestellt werden kann, ob die Methode erfolgreich ausgeführt werden konnte.

Es muß eine Parameter-Variable übergeben werden, die dann in der Methode referenziert wird. Mit anderen Worten, die übergebene Variable enthält den Rückgabewert (hier eine Anzahl).

Insofern greift Dein Lösungsvorschlag nicht, da immer ein Parameter übergeben werden muß. Ich begreife nicht, warum das Beispiel unter VBA funktioniert und nicht in xBase. In beiden Fällen wird ein Parameter (nCount) übergeben, der den (Anfangs-)Wert "0" hat. Unter VB wird nCount von der Methode mit einem Wert belegt.

Laut TypLibrary (siehe oben) muß der Parameter ein Integer-Wert sein.

Gruß,
Olaf

Verfasst: Mi, 20. Sep 2006 19:33
von AUGE_OHR
hi,
Lewi hat geschrieben: die Methode :GetCount( int*par ) gibt nicht die Anzahl zurück, sondern einen Return-Wert, mit dem festgestellt werden kann, ob die Methode erfolgreich ausgeführt werden konnte.

Es muß eine Parameter-Variable übergeben werden, die dann in der Methode referenziert wird. Mit anderen Worten, die übergebene Variable enthält den Rückgabewert (hier eine Anzahl).

Insofern greift Dein Lösungsvorschlag nicht, da immer ein Parameter übergeben werden muß.
ok verstanden, dann mal so :

Code: Alles auswählen

 nReturn := oObj:callMethod( "GetCount",nCount ) 
gruss by OHR
Jimmy

Verfasst: Mi, 20. Sep 2006 20:07
von Lewi
Hi Jimmy,
die Idee hatte ich auch schon. Leider ohne Erfolg.

Soweit ich feststellen kann, hat die von mir angesprochene COM-Schnittstelle keine integrierte Typenbibliothek. Ich versuche mal den Weg, die COM-Schnittstelle über LoadTypLib() einzubinden ( die entsprechende TLP-Datei ist vorhanden).

Vielleicht führt auch die automatische Datenkonvertierung des Parameters "nCount" zum Laufzeitfehler, da die COM Komponente keine Informationen über den Typ eines Parameters enthält.

Gibt es eine Möglichkeit Datenwerte nach VT_I4 zu konvertieren?

Verfasst: Do, 21. Sep 2006 8:58
von hschmidt
Hallo Lewi,

müsste nCount nicht per Referenz übergeben werden?
Habe so etwas noch nie gemacht, aber den Versuch ist es wert.

Hans

Verfasst: Do, 21. Sep 2006 9:35
von Lewi
Moin Hans,
Du hast natürlich Recht. nCount müßte in diesem Fall per @-Reference übergeben werden.

Das Problem scheint in meinem bezeichneten Fall die automatische Konvertierung der Daten zum COM-Object durch XBase zu sein, weil die COM-Komponete über keine integerierte Type-Library verfügt. In einer Type-Library sind (normaler Weise) Informationen über die Parameterdaten vorhanden, die dann für die Datenübergabe an die COM-Komponente herangezogen werden.

Gruß, Olaf

Verfasst: Fr, 22. Sep 2006 16:24
von Lewi
Ich habe das Problem gelöst, gleichwohl mit anderen Mitteln. Der Umweg führt über eine DLL, die ich unter .NET entwickelt habe. Über diese DLL wird dann unter xBase auf die COM-Komponente zugegriffen.

Grundsätzlich gibt es wohl mit xBase in Zusammenhang mit COM-Komponenten das Problem, dass Num-Variablen nicht (streng) typisiert werden können (z.B. gemäß C-Konventionen) , sondern ausschließlich nach der VT_Umsetzungstabelle für das Zielobject konvertiert werden, wenn die COM-Komponente über keine integreirte TypLibrary verfügt, die Informationen zu Datentypen zur Datenkonvertierung enthält.

Oder gibt es eine (undokumentierte) Möglichkeit, Varibalen zu typisieren (z.B. Int4 Int16, Int32, INT64, INTPTR usw.)?