AutomationObject, Methoden & Referenzparameter

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Lars
Rookie
Rookie
Beiträge: 5
Registriert: So, 23. Jul 2006 12:56
Wohnort: Hamburg

AutomationObject, Methoden & Referenzparameter

Beitrag von Lars »

Hallo,

ein gedachtes kleines Problem mit COM&Xbase erweist sich als sehr hartnäckig. Da die ganze COM-Thematik für mich noch ein Buch mit 7 Siegeln ist, in dem ich gerade das Inhaltverzeichnis+Vorwort gelesen habe, hoffe ich, das mir jemand weiterhelfen kann.

Aus einer Anwendung heraus (Xbase 1.9 SL1, Hotfixes bis 42), steuere ich das CAD Programm SolidWorks 2011 fern. Dort habe ich Zugriff auf eine Klasse "CustomPropertyManager" die Feld-/Wertpaare verwaltet die ich auslesen möchte.

Die VB Deklaration der Methode in der API HIlfe ist:

Code: Alles auswählen

Sub Get2( _
   ByVal FieldName As String, _
   ByRef ValOut As String, _
   ByRef ReesolvedValOut As String _
) 
Die Werte werden also über eine Refernenz und nicht über Rückgabewerte geholt.
In Xbase bekomme ich die Abfrage leider nicht hin.

Code: Alles auswählen

LOCAL cTemp1 := "", cTemp2 := ""

// Hier gibt es einen crash
// => Typkonflikt. Parameter hat falschen Typ. [Automation / 6500]
oProManager:get2("Author", @cTemp1, @cTemp2) 

// Genauso
oProManager:get2("Author", cTemp1, cTemp2) 
Durch die Alaska Newsgroup bin ich auf die gut versteckte VTType() Klasse aufmerksam geworden und habe folgendes probiert:

Code: Alles auswählen

LOCAL oTemp1 := VTType():new("", VT_BSTR+VT_BYREF), oTemp2 := VTType():new("", VT_BSTR+VT_BYREF)

oProManager:get2("Author", cTemp1, cTemp2) 
Der obige Code läuft ohne zu mucken, leider komme ich so nicht an die Werte, da oTemp1:value danach immer noch leer ist.

Wie komme ich an die Werte? Übersehe ich das offensichtliche? Ein Blick in die Doku zu "callMethod" und der automatischen Typ Konvertierung hat mir auch nicht weitergeholfen.

Gruß,
Lars
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: AutomationObject, Methoden & Referenzparameter

Beitrag von Tom »

Hallo, Lars.

Das AutomationObject verfügt über zwei implizite Methoden GetProperty und SetProperty. Letztere solltest Du mal ausprobieren.
Herzlich,
Tom
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: AutomationObject, Methoden & Referenzparameter

Beitrag von AUGE_OHR »

Lars hat geschrieben:Aus einer Anwendung heraus (Xbase 1.9 SL1, Hotfixes bis 42), steuere ich das CAD Programm SolidWorks 2011 fern. Dort habe ich Zugriff auf eine Klasse "CustomPropertyManager" die Feld-/Wertpaare verwaltet die ich auslesen möchte.
Frage : das CreateObject() hat vorher funktioniert ?

zu deinem Test Code : wenn ein String "gefüllt" werden soll musst du einen entsprechend grossen "Buffer" dafür schaffen.

Code: Alles auswählen

LOCAL cTemp1 := "", cTemp2 := ""
ich würde "behaupten" das es "so" nicht geht weil die "Länge" = 0

Code: Alles auswählen

// Hier gibt es einen crash
// => Typkonflikt. Parameter hat falschen Typ. [Automation / 6500]
oProManager:get2("Author", @cTemp1, @cTemp2) 
hm ... ok bei der "Länge" = 0

da du nun mehr als 1 Parameter hast würde ich es mal so versuchen

Code: Alles auswählen

oProManager::callMethod("get2","Author", @cTemp1, @cTemp2) 
gruss by OHR
Jimmy
Lars
Rookie
Rookie
Beiträge: 5
Registriert: So, 23. Jul 2006 12:56
Wohnort: Hamburg

Re: AutomationObject, Methoden & Referenzparameter

Beitrag von Lars »

Vielen Dank Euch 2 Für die Antworten.

@Jimmy
Ich hatte schon mit vielen Parametermöglichkeiten gespielt und wollte meinen Post nicht aufblähen, z.B.

LOCAL cTemp = space(100), cTemp2 = space(100)
oder (etwas verzweifelt)
LOCAL cTemp = replicate(chr(0), 100), cTemp = replicate(chr(0), 100)
oder (etwas mehr verzweifelt)
LOCAL cTemp = space(200)+chr(0), cTemp2 = space(200)+chr(0)

Auch "callMethod" habe ich schon durchexerziert.

Das Objekt funktioniert soweit. Es gibt da eine andere Methode "getNames" die mir brav die Namen der Attribute in einem Array zurückliefert.

Ich schaue mir jetzt mal genauer "SetProperty" und "GetProperty".

Gruß,
Lars
Antworten