Pergunta

Eu estou pensando em fazer minha aplicação existente em um RTD servidor .

O aplicativo está escrito em C ++ e enquanto eu acabará por porta-lo para C # / Mono Eu quero ser capaz de adicionar a funcionalidade IDT com C ++.

Eu descobri alguns pedaços de amostra de código (o MSVCRTDServer) e neste site: http://weblogs.asp.net/kennykerr/archive/2008/10/29/excel-rtd-server-in-c.aspx

Infelizmente estes são DLLs e eu ter esquecido tudo que eu sabia do COM (boa viagem) há muito tempo.

Como faço para ir sobre incorporando os exemplos DLL no EXE? Este é, aparentemente, sobre o empacotamento do servidor COM em um EXE em vez de uma DLL.

EDIT:

Note, o aplicativo existente tem um GUI MFC.

EDIT:

O uso pretendido é taht o aplicativo GUI existente será executado - não há necessidade para os clientes da interface COM / IDT para iniciar o aplicativo. (Embora eu não vou negar que seria bom)

Basicamente eu quero implementar a interface IRTDServer com o meu próprio dados - para que o Excel (ou outros aplicativos) pode acessar os dados dinâmicos que o aplicativo fornece. (É um programa que fala com um dispositivo de porta serial - que dispositivo tem estado / estado que as mudanças e eu quero ser capaz de clientes de atualização sobre as mudanças de forma assíncrona)

Então, eu preciso criar um objeto COM e registrá-lo para que os clientes podem "ver"-lo.

Não estou certo de como adicionar um objeto COM a um exe e ter esse objeto COM implementar uma interface existente / pré-definfed.

EDIT Eu comecei uma recompensa por isso que eu pudesse obter amostras de código. Aparentemente eu sou muito preguiçoso e estúpido (ou talvez seja apenas a aversão hiper para COM) para começar com resposta existente por Franci Penov. (Que é muito útil e um grande começo)

Então, basicamente o que eu estou procurando é:

código para tomar o meu aplicativo de diálogo com base MFC existente que tem um monte de threads em execução e transformá-lo em um servidor RTD (que tem o mesmo UI)

Tudo o que CoCreate e CoThisandthat, etc. Onde posso colocar esse código no meu exe? Como faço para estender / implementar o material IRTD?

Um antes e depois de um aplicativo Olá mundo MFC amostra (de diálogo com base) está indo para obter a resposta aceita.

  1. Antes de aplicativo com todo o código fonte para mfc diálogo aplicativo.
  2. "depois de" app que é baseado no aplicativo MFC na etapa # 1 que implementa a interface srver IDT e toda a sua fonte. (Todos os arquivos de projeto, fonte, etc)
  3. medidas tomadas no estúdio GUI / visual e de outra forma para criar a etapa 2 do passo 1. (IDL, etc outros arquivos criados.)

Idealmente, isso é fornecido para VS2008, mas qualquer versão iria funcionar.

Graças.

Foi útil?

Solução

EDIT: Cara, eu não toquei MFC desde o ano de 2000. Eu estava esperando para ficar assim para o resto da minha vida. :-) Enfim ...

Aparentemente, os assistentes têm evoluído desde o século passado. Os passos seguintes para adicionar suporte COM ATL de e aplicativo MFC são para VS 2008.

  1. Gerar um aplicativo baseado em diálogo MFC simples chamado MFCTest. não marque a caixa de seleção Automation no assistente.
  2. Botão direito do mouse sobre o projeto e selecione Adicionar / Classe ... Na caixa de diálogo, escolha ATL Simple Object. Você receberá um aviso de que o suporte ATL será adicionado ao projeto.
  3. Um novo assistente será aberto com opções para o novo objeto ATL.

Você deve ser feito.

Francamente, não vejo qualquer razão para postar aqui um código gerado pelo assistente. Mas se você ainda tenha dúvidas sobre peças específicas desse código, publicá-las no SO e eu vou ajudá-lo.


EDIT: Esta está lentamente se transformando em um artigo. Se continuar assim, eu poderia até publicar um livro. : -)

Depois de ter o objeto ATL simples integrada no projecto MFC, você pode adicionar a interface RTD a ele. Você vai precisar de tanto herdar a partir da interface e adicioná-lo à COM_INTERFACE_MAP. Como a interface RTD é uma interface IDispatch, você terá que herdar sua classe de IDispatchImpl <> e adicionar IDispatch ao COM_INTERFACE_MAP usando COM_INTERFACE_ENTRY2 (em ordem para especificar que ele é implementado através da IRtdServer.

Eu não sou muito familiarizado com a forma como funciona IDT. Você também pode ter que adicionar suporte para pontos de conexão COM a sua classe, se o Excel precisa supscribe para suas atualizações. Aqui está também um link para atualizar seu pontos de conexão na ATL conhecimento.

Btw, me deparei com este post que tem o definições das duas interfaces de IDT C ++ . Você provavelmente já tê-los, mas eu pensei que eu adicioná-lo para sermos mais completos.


A maneira mais fácil seria criar novo projeto ATL EXE através do assistente VS e deixá-lo tomar o registo e a parte de gerenciamento de processos. O resto não é muito diferente.

Se precisar de uma amostra particular para alavancar sua jornada de volta para a terra de COM out-of-proc, você pode olhar para LABRADOR .

Casal de links que podem ser de mais interesse:

EDIT: Se você só precisa saber como registrar um objeto em seu EXE com COM, assim que aplicativos cliente podem CoCreateInstance-lo, confira CoRegisterClassObject . No entanto:

  • o objeto precisa ser um objeto COM
  • você precisa implementar uma fábrica de classes para ele
  • se você quiser gestão de processos (ou seja, COM inicia seu aplicativo on demand), os nees ClassID a ser registrado no Registro
  • se o cliente está indo para criá-lo através de ProgID, a necessidade ProgIDS Para ser registrado no Registro
  • Você pode precisar de uma dll proxy personalizado / stub, se você estiver fazendo triagem feita sob encomenda
  • Se seu aplicativo tem interface do usuário, você terá que modificar a lógica de desligamento, de modo que quando o usuário fecha a interface do usuário, o aplicativo não sair untili a última referência COM a seus objetos foi liberado assim

EDIT 2: eu ainda sugiro que você olhar para o ATL amostra out-of-proc e ao esqueleto do assistente ATL geraria a entender a seqüência de operações. No entanto, pode ser necessário aprofundar um pouco no código ATL para ver o que exatamente está acontecendo.

Aqui está a versão curta do processo:

Em uma partida, os nees de aplicação para verificar se há um argumento de linha de comando particular - / embedded . Se esse argumento está presente, isso significa que o aplicativo está sendo lançado pelo COM, em resposta a uma chamada Coco. O aplicativo pode optar por não mostrar a sua UI neste momento.

Se o aplicativo mostra a interface do usuário ou não, tem que registrar as fábricas de classe para objetos de qualquer COM fornece através do CoRegisterClassObject API que eu mencionei acima.

Se o aplicativo é iniciado por COM, ele pode optar por si desligamento sobre a libertação de referência última COM. (Isto é normalmente detectada por meio de um contador de ref globais adicionais, que é aumentada em qualquer objeto AddRef e diminuiu em qualquer objeto Release). No entanto, o aplicativo não deve ser encerrado em si, se detectou que o usuário interagiu com sua interface. em tal caso, o desligamento é adiada até que o usuário fecha explicitamente o último UI (Para fazer que a detecção mais fácil, o aplicativo normalmente não mostra sua interface até que as tentativas do usuário para iniciá-lo explicitamente)

Se o aplicativo foi iniciado pelo usuário eo las UI está fechado, o aplicativo deve verificar se existem excelentes referências COM para qualquer objeto nele. Se não houver nenhum, ele pode desligar-se. Se, no entanto, há referências COM, o aplicativo deve ocultar a interface do usuário, mas continuar a correr até a última referência é liberada.

Se o aplicativo chegou a um ponto em que fará o desligamento, deve revogar todos os registros de classe de fábrica.

Outras dicas

Você organizar seu código em um projeto ATL Server. Veja amostras em amostras ATL Servidor .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top