Domanda

Sto pensando di fare la mia applicazione esistente in un RST server di .

L'applicazione è attualmente scritto in C ++ e mentre io alla fine porta a C # / Mono voglio essere in grado di aggiungere la funzionalità di RST con C ++.

Ho trovato un paio di pezzi campione di codice (il MSVCRTDServer) e questo sito: http://weblogs.asp.net/kennykerr/archive/2008/10/29/excel-rtd-server-in-c.aspx

Purtroppo queste sono le DLL e ho dimenticato tutto quello che sapevo del COM (Good Riddance) molto tempo fa.

Come faccio a incorporare gli esempi DLL in EXE? Questo è apparentemente sulla confezionamento del server COM in un file EXE, piuttosto che una DLL.

EDIT:

Nota, l'applicazione esistente ha una GUI MFC.

EDIT:

La destinazione d'uso è taht l'applicazione GUI esistente sarà in esecuzione - non è necessario per i clienti dell'interfaccia / RST COM per lanciare l'applicazione. (Anche se non nego che sarebbe bello)

Fondamentalmente voglio implementare l'interfaccia IRTDServer con il mio i dati - in modo che Excel (o altre applicazioni) possono accedere ai dati dinamici che l'applicazione fornisce. (Si tratta di un programma che parla ad un dispositivo di porta seriale - che il dispositivo ha lo status / stato che i cambiamenti e voglio essere in grado di aggiornare i client sui cambiamenti in modo asincrono)

Così, ho bisogno di creare un oggetto COM e registrarlo in modo che i clienti possono "vedere" esso.

Non sono sicuro di come aggiungere un oggetto COM per un exe e che hanno oggetto COM attuare un pre-definfed interfaccia esistente /.

EDIT Ho iniziato una taglia su questo così ho potuto ottenere esempi di codice. A quanto pare io sono troppo pigro e stupido (o forse è solo l'avversione iper a COM) per iniziare con la risposta esistente Franci Penov. (Che è molto utile e un ottimo inizio)

Quindi, in pratica quello che sto cercando è:

codice per prendere la mia applicazione MFC esistente dialogo based che ha un sacco di thread in esecuzione e di trasformarlo in un server RTD (che ha la stessa interfaccia utente)

Tutto ciò che CoCreate e CoThisandthat, ecc Dove ho messo il codice nel mio exe? Come posso estendere / implementare la roba IRTD?

Una prima e dopo di un campione di MFC ciao mondo app (dialogo based) sta per arrivare la risposta accettata.

  1. Prima di app con tutto il codice sorgente per il dialogo MFC app.
  2. "dopo" app che si basa sulla applicazione MFC al punto # 1 che implementa l'interfaccia srver RST e tutta la sua fonte. (Tutti i file di progetto, fonte, ecc)
  3. misure adottate nella GUI / Visual Studio ed al contrario per creare la fase 2 dal punto 1. (IDL, ecc altri file creati.)

Idealmente questo è previsto per VS2008, ma qualsiasi versione avrebbe funzionato.

Grazie.

È stato utile?

Soluzione

Modifica Amico, non ho toccato MFC dal 2000. Speravo di rimanere così per il resto della mia vita. :-) Comunque ...

Aparently, gli stregoni si sono evoluti dal secolo scorso. I seguenti passaggi per aggiungere il supporto COM ATL da e MFC app sono per VS 2008.

  1. Genera un'applicazione MFC alla finestra semplice chiamata MFCTest. NON selezionare la casella di controllo di automazione nella procedura guidata.
  2. Fare clic destro sul progetto e selezionare Aggiungi / classe ... Nella finestra di dialogo, scegliere Oggetto semplice ATL. Si otterrà un messaggio di avviso che il supporto ATL verrà aggiunto al progetto.
  3. Una nuova procedura guidata si aprirà con le opzioni per il nuovo oggetto ATL.

Si dovrebbe essere fatto.

Francamente, non vedo alcuna ragione per pubblicare qui un codice generato dalla procedura guidata. Ma se avete ulteriori domande su particolari parti di quel codice, pubblicarle sul SO e io ti aiuterò.


Modifica Questo si sta trasformando lentamente in un articolo. Se andiamo avanti così, potrei anche pubblicare un libro. : -)

Una volta che hai l'oggetto semplice ATL integrata nel progetto MFC, è possibile aggiungere l'interfaccia di RST ad esso. Avrete bisogno di entrambi ereditano dall'interfaccia e aggiungerlo al COM_INTERFACE_MAP. Dal momento che l'interfaccia RTD è un'interfaccia IDispatch, si dovrà ereditare la classe da IDispatchImpl <> e di aggiungere IDispatch al COM_INTERFACE_MAP utilizzando COM_INTERFACE_ENTRY2 (al fine di specificare che è implementato attraverso la IRtdServer.

Io non sono veramente a conoscenza di come funziona RTD. Si potrebbe anche essere necessario aggiungere il supporto per i punti di connessione COM per la classe, se ha bisogno di Excel supscribe per gli aggiornamenti. Ecco anche un link per aggiornare il tuo punti di connessione in ATL conoscenza.

A proposito, mi sono imbattuto in questo post del blog che ha il C ++ dei due RST interfacce . Probabilmente hai già li, ma ho pensato che vorrei aggiungere che per completezza.


Il modo più semplice sarebbe quella di creare un nuovo progetto ATL EXE attraverso la procedura guidata VS e lasciare che ci vuole della registrazione e la parte di gestione dei processi. Il resto non è molto diverso.

Se avete bisogno di un particolare campione per avviare il vostro viaggio di ritorno verso la terra di COM out-of-process, si può guardare LABRADOR .

Un paio di link che potrebbero essere di ulteriore interesse per voi:

Modifica Se avete solo bisogno di sapere come registrare un oggetto nel file EXE con COM, in modo da applicazioni client possono CoCreateInstance esso, controlla CoRegisterClassObject . Tuttavia:

  • l'oggetto deve essere un oggetto COM
  • è necessario implementare una fabbrica di classe per esso
  • se si desidera che la gestione dei processi (ad esempio, COM inizia la vostra applicazione su richiesta), il ClassID nees essere registrati nel Registro di sistema
  • se il cliente sta per crearla attraverso ProgID, la necessità ProgIDs da registrare nel Registro di sistema
  • potrebbe essere necessario un dll proxy personalizzato / stub, se si sta facendo su misura di smistamento
  • se la vostra applicazione ha interfaccia utente, sarà necessario modificare la logica di spegnimento, in modo che quando l'utente chiude l'interfaccia utente, l'applicazione non esce untili l'ultimo riferimento COM agli oggetti è stato rilasciato come pure

EDIT 2: sarei ancora suggerisco di guardare l'ATL campione di out-of-process e lo scheletro della procedura guidata ATL genererebbe per comprendere la sequenza delle operazioni. Tuttavia, potrebbe essere necessario scavare un po 'nel codice ATL per vedere esattamente cosa sta succedendo.

Ecco la versione breve del processo:

In una startup, le nees dell'applicazione per verificare la presenza di un particolare argomento della riga di comando - / embedded . Se questa tesi è presente, significa che l'applicazione è in fase di lancio da COM in risposta ad una chiamata Coco. L'applicazione potrebbe scegliere di non mostrare la sua interfaccia utente, a questo punto.

Se l'applicazione mostra l'interfaccia utente o meno, si deve registrare le fabbriche per classi di oggetti qualsiasi COM fornisce attraverso l'API CoRegisterClassObject ho citato sopra.

Se l'applicazione viene avviata tramite COM, si può scegliere di arresto per sé sul rilascio di riferimento ultima COM. (Questo è solitamente rilevata attraverso un ulteriore contatore ref globale che è aumentato su qualsiasi oggetto AddRef e diminuita su qualsiasi oggetto di rilascio). Tuttavia, l'applicazione non deve eseguire la chiusura stessa, se rilevato che l'utente ha interagito con la propria interfaccia utente. in tal caso, l'arresto è rimandata alla utente chiude esplicitamente l'ultimo UI (Per rendere più facile che il rilevamento, l'applicazione di solito non dimostra la propria interfaccia utente quando l'utente tenta di avviare esplicitamente)

Se l'applicazione è stata avviata dall'utente e il Las interfaccia utente è chiuso, l'applicazione dovrebbe verificare se ci sono in circolazione Riferimenti COM a qualsiasi oggetto in essa. Se non ce ne sono, si può spegnere in sé. Se, tuttavia, ci sono riferimenti COM, l'applicazione dovrebbe nascondere l'interfaccia utente, ma continuare a funzionare fino a quando viene rilasciato l'ultimo riferimento.

Se l'applicazione ha raggiunto un punto in cui sarà arresto, dovrebbe revocare tutte le registrazioni di classe di fabbrica.

Altri suggerimenti

È marshalling il codice in un progetto ATL Server. Vedere campioni a campioni ATL Server .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top