Probleme mit AutomationObject

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Probleme mit AutomationObject

Beitrag von Rolf »

Hallo

Es geht immer noch um das SDK.
Mit Create Object bekomme ich mein Hauptobjekt. Und habe somit auch Zugriff auf die Unterobjekte. Das klappt auch gut bis zu einer Stelle.

Folgenden VB-Code habe ich bereits übersetzt:

Code: Alles auswählen

//oP = New SDKLib.P
oP := CreateObject( "SDK.P" )

//Dim ed As SDKLib.ed
//Dim added As Boolean
//Dim desc As String

//ed = oP.NewED
ed := oP:NewED()

...

//Dim era As SDKLib.ERA
//--Schreiben in Objekt
//era = ed.A.New
era := ed:A:New()
//era.Description = "era"
era:Description := "era"  ####ERROR####

//added = ed.A.Add(era) 
//desc = ed.A.Item(1).Description 
Das AutomationObject A verfügt über die Funktionen Add(), Item(),New(),Remove(), RemoveAll() und die Eigenschaft Count. Bei New() steht als Hilfe "Erzeugt ein neues leeres Objekt vom entsprechenden Typ." und bei Add() "Fügt der Collection ein Mitglied hinzu.".

Ich bekomme den folgenden Fehler:
oError:args :
-> NIL
oError:canDefault : J
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Interne Datenstrukturen besch"digt
oError:filename : NIL
oError:genCode : 41
oError:operation : AUTOMATIONOBJECT:SETNOIVAR
oError:osCode : NIL
oError:severity : 2
oError:subCode : 6500
oError:subSystem : Automation
oError:thread : 1
oError:tries : NIL

oder wenn ich eine Methode aufrufe "AUTOMATIONOBJECT:NOMETHOD".

Hat jemand eine Idee wo das Problem liegt. Wenn ich ein existierendes Objekt A auslese, kann ich auf die Eigenschaften zugreifen.

Ich weiß nicht wo ich noch suchen soll
oder warum es in VB geht und nicht in XBase. :(

Grüße Rolf
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: Probleme mit AutomationObject

Beitrag von AUGE_OHR »

hi,
Rolf hat geschrieben: Es geht immer noch um das SDK.
sorry kannst du nochmal sagen welches SDK ?

wenn du Methoden benutzt ist die Syntax gewöhnlich

Code: Alles auswählen

oObj := myMethode(parameter)
und bei Property´s

Code: Alles auswählen

myProperty() := parameter
oft kann man Property´s erst verwenden wenn zuvor die entsprechenden
Methoden ausgeführt wurden. Was ist mit den beiden letzten Zeilen in dem
Beispiel wo zuerst ein ADD() kommt ?

gruss by OHR
Jimmy
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi

Soory, das SDK von http://www.xbaseforum.de/viewtopic.php?t=1627

Die Syntax müsste doch stimmen:

oObj := myMethode(parameter) entspricht doch
era := ed:A:New(), nur das ich eine Methode eines Objektes A des Objektes ed aufrufe.

Und es funktioniert ja auch die Methode ed:a:Item(1). Wenn ich schon zu A Objekte mit VB hinzugefügt habe und diese dann in Xbase auslese. Nur New() funktioniert nicht.

Bei den letzten beiden Zeilen kommt es auch zu einem Absturz "unbekannter Fehler".

Grüße Rolf
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Rolf,

Code: Alles auswählen

oError:args : -> NIL
macht mich stutzig. Enthält era oder A nach

Code: Alles auswählen

era := ed:A:New()
vielleicht NIL ?


Günter
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi Günter

Leider nicht

ValType(era) -> "O"
era:className() -> "AutomationObject"

era:interface -> ##ERROR## siehe oben
era:interfacename -> NIL
era:license -> ""
era:CLSID -> ""
era:server -> ""


Ich habe schon überlegt ob ich noch ein create() ausführen muss oder irgendeinen Cast. Aber da bracht ComLastMessage() irgendetwas mit "Klassenname nicht gefunden" zurück.

Ich wollte vom SDK eben die COM-Schnittstelle verwenden und es klappte in mehreren Punkten schon sehr gut. Nur eben dieser New()-Punkt nicht. Der Service-Mittarbeiter hat mir damals eben den oberen VB-Code geschickt und der sieht auch einfach aus. Nun ist er leider im Urlaub und ich hänge ein bisschen in der Luft. :|

Grüße Rolf
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Rolf,
era:interface -> ##ERROR## siehe oben
era:interfacename -> NIL
Hmm.

Wie steht es um die Property mit dem vielsagenden Namen "A" ?

Ist die Hilfedatei zu diesem SDK eventuell im Internet frei zugänglich? Wenn ja, würde ich mal einen Blick hinein werfen.

Günter
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi Günter

Leider ist die Hilfedatei nicht frei zugänglich. (siehe http://www.xbaseforum.de/viewtopic.php?t=1627 letzter Eintrag)

Das Objekt A besitzt folgende Funktionen und Eigenschaften in VB-Syntax
Public Function New() As A
- Erzeugt ein neues leeres Objekt vom entsprechenden Typ
- Das neue Objekt wird zunächst nicht der Collection hinzugefügt.
Zu diesem Zweck steht die Methode Add zur Verfügung

Public Function Add( ByVal pIA As A) As Boolean
- Fügt der Collection ein Mitglied hinzu.

Public Function Item( ByVal Index As Variant ) As A
- Liefert ein bestimmtes Mitglied der Collection zurück

Remove und RemoveAll habe ich nicht mit aufgeführt

Public Property Count() As Long
- Anzahl der Objekte in dieser Collection

Das Objekt Era unter anderem
isEmpty(), isValid()...., Description...
also nichts besonderes. Bei Zugriff auf irgendeine Funktion und Eigenschaft folgt der Absturz.

Das Objekt A ist eine Liste die mehrere Objekte Era enthalten kann.

Das Problem liegt meiner Meinung nach darin, dass ich mit New() ein AutomationObject bekomme was völlig losgelöst von dem "AutomationBaum" ist. Und das Objekt bekommt erst wieder druch das Add() diese Verbindung. Und somit sind die Methoden nach dem Aufruf von New() unbekannt und bei Item() nicht.
Könnte ich wie in VB ein Variable vom entsprechenden Typ vordefinieren, müssten die Funktionen bekannt sein. :?
Keine Ahnung, nur eine Theorie

Grüße Rolf
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Rolf,

ich meine, gibt es was Auffälliges zu sehen, wenn du die verkettete Anweisung ed:A:New() auseinandernimmst, um ed:A inspizieren zu können?

oA := ed:A
? oA:interface
? oA:interfaceName

era := oA:New()
? era:interface

Dass die bloße Abfrage der Member-Variablen :interface einen Fehler auslösen kann, ist schon krass (und vielleicht auch neu für Alaska).


Viele Grüße,
Günter
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

Beitrag von AUGE_OHR »

hi,
Rolf hat geschrieben: Das Problem liegt meiner Meinung nach darin, dass ich mit New() ein AutomationObject bekomme was völlig losgelöst von dem "AutomationBaum" ist. Und das Objekt bekommt erst wieder druch das Add() diese Verbindung. Und somit sind die Methoden nach dem Aufruf von New() unbekannt und bei Item() nicht.
irgendwie erinnert mich das ganze an sysmon.ocx was auf jeden XP
Rechner ist. Leider kann man da auch kein ADD() etc. mit Xbase++
ausführen während das VB / Html Beispiel funktioniert.

Ich habe dann das ganze zum beta-Team geschickt und folgende Anwort
The problem is with the return value of counters. The interface that is the
return value when calling the COM objects "counters" property is not
derived from IDispatch and thus it is not possible to dynamically resolve
the location of the method "Add".

This really is a pitty. I really would have liked to include the performance
monitor in Xbase++ applications :-(
Ich denke du solltest dich mit deinem Problem mal bei Alaska melden.

gruss by OHR
Jimmy
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi Jimmy

Wie meldet man sich bei Alaska? (Wäre das erste mal)

Das Problem wäre dann auch, das Alaska ja bei sich den Fall nicht nach empfinden kann, da ich das SDK nicht rausgeben darf. :|

Grüße Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

wenn man denkt dass man einen Fehler in Xbase++ gefunden hat, füllt man die Textdatei PDRX.TXT im Xppw32 Verzeichnis aus und sendet diese an Alaskas Support. Teilweise heißt die Txtdatei auch etwas anders (Tools etc.)

Ansonsten kann man auch einfach das Problem schildern, ob sie das dann aber ohne die 'richtige' subscription bearbeiten bleibt dem Support überlassen.

Ein Hinweis auf solche Probleme kann auf jeden Fall nichts schaden, auch wenn du das SDK nicht mitsenden darfst. Einfach den Hersteller und das Produkt nennen. Alaska muss schließlich ein großes Interesse am Beseitigen solcher Fehler haben, da schließlich sonst zu VB gegriffen werden muss :wink:
Gruß
Hubert
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

Beitrag von AUGE_OHR »

hi,
Rolf hat geschrieben: Wie meldet man sich bei Alaska? (Wäre das erste mal)
wichtig ist das du immer ein volles Sample mitschickst damit die das
"nur" noch laufen lassen müssen.
Rolf hat geschrieben: Das Problem wäre dann auch, das Alaska ja bei sich den Fall nicht nach empfinden kann, da ich das SDK nicht rausgeben darf. :|
weswegen eigendlich ? kann das nicht jeder Developer anfordern natürlich
mit der entsprechenden Agreement ?
Du solltest bei der Firma mal anfragen ob ihre COM Class "derived from
IDispatch" ist weil Xbase++ z.Z. nur das kann.

Wenn Alaska bei dem activeX nichts für dich hat könntest du dich auch
noch an den Michael Hoffmann seiner Cockpit Library wenden.
The Differences between Cockpit's COM Support and the Xbase++ ActiveX
Wrappers

The new ActiveX support announced for 1.9 will provide you with access to one
interface: IDispatch. Internally the AutomationObject will also use some other
interfaces, to do some housekeeping, to retrieve event names and parameters
and to finally receive events from a wrapped ActiveX object. Hence the
AutomationObject will only work with COM objects that support the IDispatch
interface or dual interfaces that inherit from IDispatch. This will in reality not
prove to be a big issue, because many COM objects support the plain IDispatch
or dual interfaces. Still there are quite a few COM objects, for example in the
Windows Shell area, that do not support IDispatch at all. For example shell
links cannot be created or modified through an IDispatch interface. Or the
running object table (ROT) cannot be accessed through a dispinterface.
deshalb empfinde ich die Xbase++ v.1.9.3x activeX Class auch nur als
sehr rundimentär ... da konnte JazzAge v3.0 schon mehr.

man braucht eigendlich nur mal auf seiner XP Festplatte zu suchen nach
*.OCX und versuchen die per Xbase++ anzusprechen. ca. 50% gehen
nicht (oder ich habe es nicht gepackt) vollständig da die wohl IUnknown
(hat jedes COM Object) statt IDispatch ( OLE automation ) benutzen.

gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Rolf,

wenn Alaska auf diesem Wege motiviert werden könnte, künftig auch reine IUnknown-Interfaces zu unterstützen, wäre das natürlich Klasse. Aber ob deine Anwendung darauf warten kann?

Unterdessen sehe ich mehrere Ausweichmöglichkeiten.

Michael Hoffmanns Produkt Cockpit kann das wohl heute schon, wie Jimmy schrieb.

Hannes Ziegler hat möglicherweise ein entsprechendes Produkt in der Pipeline, wenn ich diesbezügliche Posts in den Alaska-Newsgroups richtig verstehe.

Wenn Ihr in der Firma auch mit VB arbeitet, könnte man überlegen, die betreffenden COM-Objekte in Dispatch-taugliche Container-Objekte zu verpacken, also eine Automation- und damit Xbase++ - kompatible Interfaceschicht zu entwerfen.

Wenn alle Stricke reißen, bleibt noch der direkte Weg über das DLL-Interface.

Viele Grüße,
Günter
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hallo,

vielen Dank für die sehr inhaltsreichen Informationen.
Das weitere Vorgehen muss ich nun erst mal mit meinem Chef bereden, auch ob wir eine Supportmeldung an Alaska versenden.

@Jimmy und Hubert
Das einrichten der Testumgebung hat mehrere Wochen (mit EMail-Verkehr und Versand) gedauert und auch die Anschaffungskosten für die "Muss"-Hardware haben wir auch selbst getragen. Ich denke das ist zu viel Aufwand für Alaska.
Das mit dem "IDispatch", werde ich nochmal nachfragen.

@Günter
Die Dll-Schnittstelle habe ich auch schon angearbeitet und bin auch gleich wieder auf Probleme gestoßen. Aber es gibt noch bei dem Parent-Objekt ed eine XML-Property in der man die Objekte irgendwie als Struktur übergeben kann. Mal sehen.

Nun stehen wieder mehrere Wege offen und die müssen erst mal ausgeleuchtet werden.

Vielen Dank für eure Hilfe :)
Grüße Rolf
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Nachtrag:

Alle Objekte des SDKs sind laut Hersteller von iDispatch abgeleitet.
Nun haben wir eine Support-Anfrage an Alaska abgeschickt.

Grüße Rolf
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Lösung:

Ich habe nun schon mehrmals mit dem Support von Alaska EMails ausgetauscht und bin sehr zufrieden.
Es scheint so eine Art Namenskonflikt mit der Methode New() zu geben.

Also statt

Code: Alles auswählen

era:=oED:A:New()
sollte folgendes

Code: Alles auswählen

era:=oED:A:CallMethod( "New" ) 
verwendet werden.

Damit klappt es bei mir, und nimmt mir einige Sorgen ab. :D

Vielen Dank nochmal für eure Hilfe
Gott fügt alles wunderbar (Psalm 50,15).
Grüße Rolf
Antworten