Zugriff auf Variantarray von IMAPITable Properties
-
Hat echt noch niemand hier über c++ auf ein vbObject zugegriffen, oder hat einfach keiner Lust davon zu berichten?
-
Nur mal ein Gedanke - hast du mal versucht,
typeidauf dieses Objekt loszulassen?
-
Lies bitte doch einfach mal die Beschreibung. Was für ein Interface eine Schnittstelle zurückgibt steht zu 100 Prozent eben genau in der Doku drin!
Ansonsten steht Dir IDispatch::GetTypeId zur Verfügung!Grundsätzlich: Du stocherst etwas viel im COM Nebel herum, evtl. solltest Du Dir hier noch mehr Basiswissen aneignen.
@CStoll: Da es sich um eine Com Schnittstelle handelt wird es wenig Erfolg haben, da vermutlich das Interface sogar gemarshalled ist.
-
Martin Richter schrieb:
Lies bitte doch einfach mal die Beschreibung. Was für ein Interface eine Schnittstelle zurückgibt steht zu 100 Prozent eben genau in der Doku drin!
Ansonsten steht Dir IDispatch::GetTypeId zur Verfügung!Grundsätzlich: Du stocherst etwas viel im COM Nebel herum, evtl. solltest Du Dir hier noch mehr Basiswissen aneignen.
@CStoll: Da es sich um eine Com Schnittstelle handelt wird es wenig Erfolg haben, da vermutlich das Interface sogar gemarshalled ist.
Du meinst die Doku über IDispatch in msdn oder wie?
Das mit dem GetTypeId könnte mir helfen. Ich werd mal schauen, ob ich das verwenden kann.
Welche Doku meinst du? Wie wäre es mal mit einem Link? Ist ja vielleicht auch noch für andere Leute interessant, die sich möglicherweise mal hierher verlaufen.
-
Es geht mir um COM und OLE-Automatisation...
MSDN ist viel und nicht unbedingt zielgerichtet. Aber sicherlich findest Du dort "alles".
Ich bin keine gute Adresse um Auskünfte über Tutorials zu geben.
-
Martin Richter schrieb:
@CStoll: Da es sich um eine Com Schnittstelle handelt wird es wenig Erfolg haben, da vermutlich das Interface sogar gemarshalled ist.
Daran habe ich nicht gedacht. Aber bei COM-Objekten hast du auf jeden Fall einen IUnknown in der Hand, wenn nicht sogar etwas hilfreicheres, das Informationen über den Datentyp liefern könnte.
-
CStoll schrieb:
Daran habe ich nicht gedacht. Aber bei COM-Objekten hast du auf jeden Fall einen IUnknown in der Hand, wenn nicht sogar etwas hilfreicheres, das Informationen über den Datentyp liefern könnte.
Richtig! In dem Falle sogar ein IDispatch, dass freiwillig eigentlich alles verrät.

-
Also IUnkown hat lediglich 3 Methoden zur Auswahl.
AddRef
QueryInterface
ReleaseWenn ich den Objekttyp kennen würde, könnte ich über QueryInterface wohl einen Pointer darauf bekommen. Aber! Wie gesagt, ich kenne den Objekttyp nicht.
Was wohl also benutzt werden muss, ist, IDispatch.
Ich bin noch nicht dazu gekommen, dass mit dem Typeinfo auszuprobieren. Ich schaue mir das jetzt mal an.
-
Mal ne frage:
Was erhalte ich, wenn ich das hier abfrage:
hr = variantProperty.pdispVal->GetTypeInfo(0,NULL,&pTInfo); pTInfo->GetFuncDesc(0, &pDesc); f << "memid: " << pDesc->memid << endl; f << "HEXmemid: " << hex << pDesc->memid ....variantProperty ist die Eigenschaft deren vt (Type) = 9 ist. Mit pdispVal hole ich mir einen Pointer auf das IDispatch. GetTypeInfo sollte nun also beschreibende Informationen in pTInfo schreiben usw.
Ist auch alles gut soweit. Das hier kommt dabei heraus:
memid: 1610612736 HEXmemid: 60000000Aber was bedeutet das? Oder noch anders gefragt: Gehe ich da den richtigen Weg, wenn ich Informationen über den Typ von variantProperty herausbekommen will?
-
Und warum schaust Du nicht einfach mal mit GetDocumentation nach?
Hier ein netter Artikel, der durch die gesamte ITypeInfo führt
http://spec.winprog.org/typeinfo/
http://spec.winprog.org/typeinf2/
http://spec.winprog.org/typeinf3/Teil 2+3 ist IMHO an wichtigsten
Mal grundsätzlich: Warum machst Du das nicht einfach mal mit einem Stück VBScript code und testest das aus.
Und nochmal: Warum liest Du nicht das was in der Doku steht? Dort wird Dir gesagt welche Methode welche Objekte liefert.
Lies doch erstmal einpaar Grundlagen und stocher nicht so im Nebel herum:
http://msdn.microsoft.com/en-us/library/ms221375.aspx
-
Martin Richter schrieb:
Mal grundsätzlich: Warum machst Du das nicht einfach mal mit einem Stück VBScript code und testest das aus.
Ja darüber habe ich auch schon nachgedacht. Ich bin es allerdings nicht gewohnt, dass eine so einfache Aufgabe derart kompliziert in der Umsetzung ist. Mir scheint das alles was von microhsoft kommt, ein endloses patchworking ist. Verschiedene technologien existieren nebeneinander, aber nichts greift ineinander. Und von einem schlüssigen Gesamtkonzept kann hier absolut nicht die Rede sein.
Wenn man sich hingegen mal anschaut, wie strukturiert beispielsweise das Java SDK ist, dann kann man gut erkennen, was es bedeutet ein richtige Konzept zu haben und nicht ständig etwas mit etwas anderem zu ergänzen, dann Mängel aufzudecken, und dann einen weiteren Flicken hinzuzufügen. ... echt ein Albtraum.
-
Martin Richter schrieb:
Und warum schaust Du nicht einfach mal mit GetDocumentation nach?
Dazu hab ich hier ein interessantes Zitat aus http://spec.winprog.org/typeinf2/ (vielen Dank für den Link an dieser Stelle, scheint hilfreich zu sein)
GetNames won't work, but ITypeLib::GetDocumentation will (why type names are called "documentation" is beyond me).
Ich möchte dazu sagen, dass ich das nicht so explizit poste um dich zu foppen. Bloß möchte ich nicht, dass der Eindruck entsteht COM sei intuitiv nutzbar, und das man es am Besten lassen soll, wenn man nicht von sich selbst heraus durchsteigt und bei einer ähnlichen Problemstellung direkt darauf kommt getDocumentation zu benutzen. Mir scheint bei der Benutzung von COM ist rein gar nichts intuitiv nutzbar, und für alles gibt es besondere Konzepte, deren Nutzen sich vielleicht mal später, aber einigen wohl auch niemals erschließt, wie das Zitat zeigt.
-
Wer sagt das Programmieren irgendwas mit Inituition zu tun hat.
Ich habe keine Probleme mit COM und auch nicht mit Automatisation. Nur kommt es mir vor, dass Du mit 0-Vorkenntnissen gleich einen Tieftauckurs veranstaltest.
BTW: Ich finde VARIANTs und SafeArray's ausgesprochen intuitiv, allerdings hast Du Dich da auch icht einfach dran gehalten was Du bekommst sondern was Du ein einem Sample zu einem ganz anderen Thema gesehen hast.
Geschmacksache. Vieleicht bin ich schonzu lange in diesem Geschäft um die Schwierigkeiten noch zu sehen.
-
Martin Richter schrieb:
Ich habe keine Probleme mit COM und auch nicht mit Automatisation. Nur kommt es mir vor, dass Du mit 0-Vorkenntnissen gleich einen Tieftauckurs veranstaltest.
Eben genau das ist der Punkt: Niemals zuvor hatte ich es nötig derart langwierige Nachforschungen anstellen zu müssen, um ein eigentlich simples Problem zu lösen. IMAPITable ist ein simples 2D Array, dass einen Satz Columns (Properties) enthält und jeder Column ist ein Wert einer konkreten Ausprägung zugewiesen. Den Wunsch umzusetzen, ein simples 2D Array zu durchlaufen kann man wohl allenfalls als einen intuitiven Vorgang beschreiben - großartig Probleme gibt es da nicht zu lösen, und mit einem Tieftauchkurs hat das doch nun wirklich nichts zu tun. Allerdings scheint COM dieses triviale Vorhaben den Anforderungen nach, zu einem Tieftauchkurs erheben zu wollen, wie mir scheint.
Und wie gesagt: Um ein derart triviales Vorhaben umsetzen zu können, kann es eigentlich nicht sein, dass man erst seitenweise Literatur lesen muss. Zumindest war das bisher bei mir noch nie der Fall.
Ich bin gerade bei OutlookSpy am Testen inwieweit sich die VBScript Konsole nutzen lässt, um an stichhaltigere Informationen gelangen zu können. Ich melde mich dann wieder.
-
Also in VBScript gehts mit:
set Session = CreateObject("Redemption.RDOSession") Session.Logon() set items = Session.GetDefaultFolder(olFolderTasks).Items set Table = CreateObject("Redemption.MAPITable") Table.Item = items set rs = Table.ExecSQL("SELECT * FROM FOLDER") MsgBox rs.Fields.Count Session.Logoff()immerhin soweit, dass man schon mal die Zahl 44, korrespondierend mit der Anzahl an Properties der entsprechenden IMAPITable ausgegeben bekommt. Und da sage noch jemand COM sei nicht intuitiv
