Umsetzung eines VB-Beispiels nach xBase

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Umsetzung eines VB-Beispiels nach xBase

Beitrag 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
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: Umsetzung eines VB-Beispiels nach xBase

Beitrag 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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag 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
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

Beitrag 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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag 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?
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag 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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag 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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag 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.)?
Antworten