Frage

Ich plane meine bestehende Anwendung in eine RTDServer auf machen.

Die Anwendung zur Zeit in C ++ geschrieben ist und während ich schließlich Portierung auf C # / Mono mag ich in der Lage sein, die FTE-Funktionalität mit C ++ hinzuzufügen.

Ich habe ein paar Probestücke von Code (der MSVCRTDServer) und dieser Seite gefunden: http://weblogs.asp.net/kennykerr/archive/2008/10/29/excel-rtd-server-in-c.aspx

Leider sind diese DLLs, und ich habe alles, was ich (Good Riddance) vor langer Zeit wusste von COM vergessen.

Wie kann ich mich über die DLL-Beispiele in die EXE enthält? Dies ist offenbar über das Verpacken des COM-Server in eine EXE-Datei anstelle einer DLL.

EDIT:

Beachten Sie die bestehende App hat einen MFC-GUI.

EDIT:

Die bestimmungsgemäße Verwendung ist taht die bestehende GUI-Anwendung ausgeführt werden soll - keine Notwendigkeit für Kunden aus der COM / RTD-Schnittstelle die App zu starten. (Obwohl ich nicht leugnen, dass wäre schön)

Im Grunde möchte ich die IRTDServer Schnittstelle mit eigenen Daten implementieren - so dass Excel (oder andere Anwendungen), die dynamischen Daten zugreifen kann, dass die Anwendung bereitstellt. (Es ist ein Programm, das mit einem seriellen Port-Gerät spricht - das Gerät hat den Status / Zustand, dass Änderungen und ich möchte in der Lage sein, Kunden über die Änderungen asynchron zu aktualisieren)

Also, ich brauche ein COM-Objekt erstellen und registrieren, so dass die Kunden „sehen“ kann es.

Ich bin nicht sicher, wie ein COM-Objekt zu einer exe hinzuzufügen und haben das COM-Objekt einen vorhandenen / pre-definfed Schnittstelle implementieren.

EDIT Ich begann auf diese eine Prämie, so konnte ich Code-Beispiele erhalten. Offenbar bin ich zu faul und dumm (oder vielleicht ist es nur die Hyper Abneigung gegen COM), um mit loszulegen bestehenden Antwort von Franci Penov. (Das ist sehr nützlich und ein guter Start)

Also im Grunde, was ich suche ist:

Code meine bestehende dialogbasierte MFC-Anwendung zu nehmen, die ein Bündel von Fäden haben laufen und es in einen RTD-Server (das hat die gleiche UI)

Alles, CoCreate und CoThisandthat etc. Wo ich diesen Code in meine exe setzen Sie? Wie kann ich ausfahren / implementieren die IRTD Sachen?

A vor und nach einer Probe MFC Hallo Welt app (Dialog basiert) wird die akzeptierte Antwort zu bekommen.

  1. Vor der App mit allen Quellcode für mfc Dialog App.
  2. „nach“ App, die auf der MFC-Anwendung in Schritt # 1 basiert, die den RTD srver Schnittstelle und alle seine Quelle implementiert. (Alle Projektdateien, Quelle usw.)
  3. Schritte in dem GUI / Visual Studio und ansonsten Schritt erstellen 2 aus Schritt 1. (IDL, etc andere Dateien erstellt.)

Im Idealfall ist dies für VS2008 zur Verfügung gestellt, aber jede Version funktionieren würde.

Danke.

War es hilfreich?

Lösung

EDIT: Geck, ich habe MFC nicht berührt seit dem Jahr 2000. Ich hatte gehofft, auf diese Weise für den Rest meines Lebens zu bleiben. :-) Wie auch immer ...

Aparently, haben die Zauberer seit dem letzten Jahrhundert entwickelt. Die folgenden Schritte zum Hinzufügen von ATL COM-Unterstützung zu und MFC-Anwendung sind für VS 2008.

  1. Erstellen Sie eine einfache MFC dialogbasierte Anwendung namens MFCTest. NICHT überprüfen Sie die Automation Checkbox im Assistenten.
  2. Rechtsklick auf das Projekt und wählen Sie Hinzufügen / Class ... Im Dialog wählen Sie ATL Simple Object. Sie erhalten eine Warnung erhalten, dass ATL-Unterstützung in das Projekt eingefügt werden.
  3. Ein neuer Assistent wird mit Optionen für das neue ATL-Objekt öffnen.

Sie sollten durchgeführt werden.

Ehrlich gesagt, ich sehe keinen Grund, hier einen Assistenten generierte schreiben Code. Aber wenn Sie weitere Fragen haben, auf bestimmte Teile des Codes, poste sie so weiter und ich werde dir helfen.


EDIT: Das wird langsam in einen Artikel drehen. Wenn wir so weitergehen, könnte ich sogar ein Buch veröffentlichen. : -)

Wenn Sie das einfache ATL-Objekt integriert in dem MFC-Projekt haben, können Sie die RTD-Schnittstelle, um es hinzuzufügen. Sie müssen sowohl von der Schnittstelle erben und an den COM_INTERFACE_MAP hinzuzufügen. Da die RTD-Schnittstelle eine IDispatch Schnittstelle ist, werden Sie Ihre Klasse von IDispatchImpl erben müssen <> und IDispatch zum COM_INTERFACE_MAP mit COM_INTERFACE_ENTRY2 (um festzulegen, dass es durch die IRtdServer umgesetzt wird.

Ich bin nicht wirklich vertraut mit, wie RTD arbeitet. Sie könnten auch an Unterstützung für COM-Anschlussstellen hinzufügen Ihre Klasse, wenn benötigt Excel Ihren Updates supscribe. Hier ist auch ein Link Verbindungspunkte in ATL aktualisieren Wissen.

Btw, ich eher zufällig auf dieser Blog-Post, die die C ++ Definitionen der beiden Schnittstellen RTD. Sie haben wahrscheinlich schon haben sie, aber ich dachte, dass ich es für Vollständigkeit halber hinzufügen würde.


Der einfachste Weg wäre, neues ATL-EXE-Projekt durch die VS-Assistenten zu erstellen und lassen Sie es von der Registrierung nehmen und dem Prozessmanagement teil. Der Rest ist das nicht anders.

Wenn Sie eine bestimmte Probe benötigen, um Ihre Reise, um Starthilfe zurück in das Land der COM out-of-proc, können Sie sich unter LABRADOR .

Ein paar Links, die von weiter für Sie interessant sein könnten:

EDIT: Wenn Sie müssen nur wissen, wie ein Objekt in Ihrer EXE mit COM zu registrieren, so dass Client-Anwendungen es CoCreateInstance können Besuche CoRegisterClassObject . Allerdings:

  • muss das Objekt ein COM-Objekt sein
  • Sie brauchen eine Klasse Fabrik für sie umzusetzen
  • , wenn Sie Prozessmanagement wollen (dh COM startet die App auf Anfrage), nees die ClassID in der Registrierung registriert werden
  • , wenn der Kunde wird es durch ProgID zu schaffen, die ProgID Notwendigkeits in der Registrierung registriert werden
  • Sie können einen benutzerdefinierten Proxy / Stub-DLL benötigen, wenn Sie benutzerdefinierte Rangier tun
  • Wenn Ihre App UI haben, werden Sie die Shutdown-Logik ändern müssen, so dass, wenn der Benutzer die Benutzeroberfläche schließt, wird die App nicht untilI den letzten COM Bezug auf Ihre Objekte verlassen wurde ebenfalls veröffentlicht

EDIT 2: Ich würde noch vorschlagen, dass Sie bei der ATL suchen out-of-proc Probe und am Skelett des ATL-Assistent erzeugen würde die Folge von Operationen zu verstehen. Allerdings müssen Sie ein wenig in der ATL-Code vertiefen, um zu sehen, was genau vor sich geht.

Hier ist die kurze Version des Prozesses:

Bei einer Inbetriebnahme, die Anwendung nees für ein bestimmtes Befehlszeilenargument zu überprüfen - / embedded . Wenn dieses Argument vorhanden ist, bedeutet es, die App von COm als Reaktion auf einen CoCO Anruf gestartet wird. Die App kann wählen, um nicht seine UI an dieser Stelle zu zeigen.

Ob die App die Benutzeroberfläche zeigt oder nicht, hat es die Klasse Fabriken registrieren für alle COM-Objekte es die CoRegisterClassObject API bietet durch die ich oben erwähnt.

Wenn die App über COM gestartet wird, kann es zum Herunterfahren selbst auf der letzten COM Referenz Freigabe wählen. (Dies wird in der Regel durch einen zusätzlichen globalen ref Zähler erfaßt, die auf jedem Objekt AddRef und verringerten auf jedem Objekt freigeben werden erhöht). Jedoch sollte die Anwendung nicht die Abschaltung selbst, wenn es erfasst wird, dass der Benutzer mit seiner Benutzeroberfläche interagierten. bis der Benutzer in einem solchen Fall wird der Shutdown explizit die letzte UI schließt verschoben (um die Erkennung zu erleichtern, in der Regel die App nicht seine UI nicht angezeigt, bis der Benutzer es explizit zu starten versucht)

Wenn die App durch den Benutzer und die las UI gestartet wurde geschlossen ist, sollte die App überprüfen, ob es ausstehenden COM Angaben beziehen sich auf ein beliebiges Objekt in ihm. Wenn es keine gibt, kann es Herunterfahren selbst. Wenn jedoch gibt es COM-Verweis, sollte die App die UI verstecken, aber weiterlaufen, bis der letzte Verweis freigegeben wird.

Wenn die App erreicht einen Punkt, an dem es shutdown, sollte es alle Klassen Fabrik Registrierungen widerrufen.

Andere Tipps

Sie Marschall Code in einem ATL-Server-Projekt. Siehe Proben unter ATL Server-Beispiele .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top