Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

OLE-Automation - Klassendefinition einer "coclass"

Empfohlene Antworten

Veröffentlicht

Hallo !

Ich arbeite momentan an einer Schnittstelle (via OLE) zu MS Project 2002 und bin auf folgendes Problem gestossen:

Ich habe aus der .olb von MS-Project mit VC++ 7 Klassen generieren lassen, mit denen ich Project steuern möchte. Das starten und erzeugen eines neuen Files klappt wunderbar, nur bekomme beim Aufrufen der get_Project() Methode nicht das (von mir) erwartete Klassenobjekt zurück. Und zwar benötige erst einmal das Klassengerüst einer Klasse, die in der odl wie folgt definiert ist:


[

  uuid(1019A320-508A-11CF-A49D-00AA00574C74),

  helpcontext(0x000200a9)

]

coclass Project {

    [default] dispinterface _IProjectDoc;

    [default, source] dispinterface _EProjectDoc;

};

Die beiden Klassen _IProjectDoc und _EProjectDoc kann ich mit dem Klassenassistent erzeugen lassen, aber ich benötige die Klasse "Project", da diese wie oben erwähnt von der Methode get_Project() der Application zurückgegeben wird. Nun meine Frage: wie kann ich deren Klassendefinition erzeugen (sie wird nicht im Assistenten angezeigt) ? Die Application-Klasse ist in der .olb ähnlich definiert:

[

  uuid(36D27C48-A1E8-11D3-BA55-00C04F72F325),

  helpcontext(0x0002008e)

]

coclass Application {

    [default] dispinterface _MSProject;

    [source] dispinterface _EProjectApp;

    [default, source] dispinterface _EProjectApp2;

};

Hier habe ich einfach die generierte Klasse _MSProject in "Application" umbenannt und es funktioniert (zumindest kann ich MS Project starten und File öffnen etc.) nur eben hilft das Umbenennen der Klasse aus Abs. 1 von "_IProjectDoc" in "Project" nichts (es lässt sich zwar kompilieren, aber zur Laufzeit bekomme ich Ausnahmefehler beim OleDispatcher).

Weiss jemand von euch weiter ?

PS: im Internet finde ich nichts zu diesem Problem (oder mir fehlen die richtigen Suchbegriffe)

, nur bekomme beim Aufrufen der get_Project() Methode nicht das (von mir) erwartete Klassenobjekt zurück.
Sondern? Zeig bitte mal den Aufruf.

Die beiden Klassen _IProjectDoc und _EProjectDoc kann ich mit dem Klassenassistent erzeugen lassen, aber ich benötige die Klasse "Project", da diese wie oben erwähnt von der Methode get_Project() der Application zurückgegeben wird.
Wie kommst du darauf? get_Project sollte eigentlich nur ein LPDISPATCH zurückgeben.

Die generierten Klassen sind von COleDispatchDriver abgeleitet, und damit Wrapper um Interfaces, nicht um CoClasses. Es gibt keinen Grund, da irgendetwas umzubenennen.

Den Rückgabewert von get_Project solltest du an eine Instanz der Wrapperklasse von _IProjectDoc oder _EProjectDoc binden können, je nachdem, welches Interface du brauchst.

Das Problem habe ich soeben gelöst, indem ich die Wrapper-Klassen mit dem Klassenassistent von VC++6 (anstatt dem von VC++7) erstellt habe, dann da bekomme ich wie du bereits gesagt hast, einen LPDISPATCH Zeiger zurück und kann damit jetzt auf die Projekt-Struktur zurückgreifen.

Aber jetzt habe ich das nächste Problem: Was muss ich implementieren, um die Events von MS-Project abzufangen ? Ich habe mich durch die MSDN gehangelt und versucht, die Beispiele die es dazu für Excel und Word gibt für MS-Project umzusetzen, allerdings scheitert es dort an der Eintragung meines Event-Objekts am Connection Point (Result(HRESULT) ist ungleich Null).

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.