2010-03-04 21 views
7

Deseo utilizar un dll COM en mi biblioteca C++. La forma Supuse ir sobre él, es import archivo .tlb de la DLL, lo que hice:Cómo usar COM dll en mi programa C++

#import "mycom.tlb" no_namespace 

El problema es que no sé muy bien dónde colocar esta declaración. ¿Debería estar dentro del archivo H o del archivo CPP? o tal vez el archivo stdafx.h? Intenté colocarlo en el archivo .cpp, solo para probarlo.

en el archivo H he declarado a este miembro:

ILogicSecuredPtr m_pbLogic; 

(donde ILogicSecured es la interfaz que quiero trabajar en mi DLL COM)

Luego añade esta en el constructor para crear una instancia la interfaz:

CoInitialize(NULL); 
m_pbLogic(__uuidof(LogicSecured)); 

(donde LogicSecured es el nombre del objeto que implementa la interfaz)

En el destructor que ha añadido:

CoUninitialize(); 

Esto no se compilará sin embargo, no importa donde trato de colocar la declaración import. simplemente no reconoce el objeto ILogicSecured. me sale este error en el archivo H:

Error 2 error C2146: syntax error : missing ';' before identifier 'm_pbLogic' 

También debo mencionar que cuando F12 (en Visual Studio) en la declaración ILogicSecuredPtr, me lleva al archivo tlh bien. Entonces sé que lo reconoce.

¿Qué estoy haciendo mal aquí?

Muchas gracias. Roey

Respuesta

3

El problema es que cuando el compilador analiza el archivo .h todavía no ha visto el #import. Dado que su proyecto es pequeño, su mejor opción es poner #import en stdafx.h.

Al presionar F12, Visual Studio usa la información de la base de datos Intellisence que se forma al analizar todas las fuentes en orden que podría ser diferente de la orden de compilación. Por lo tanto, es bastante típico que Intellisence sepa dónde se declara algo y el compilador no lo compila al mismo tiempo.

+0

¿Puedo engrosar un poco la trama? Si trato de agregar el # import en el archivo stdafx.h, el m_pbLogic (__ uuidof (LogicSecured)); parte del código no se compila, diciendo Error 18 error C2064: término no evalúa a una función tomando 1 argumentos – Roey

+1

Correcto - usted intenta llamar al constructor de la variable miembro dentro del cuerpo del constructor - esto no está permitido. Debería usar en su lugar el método CreateInstance() del IWhateverPtr. – sharptooth

+0

Gracias por la respuesta rápida. ¿Podría darme un ejemplo falso de cómo llamar a CreateInstance en mi situación? y dónde colocarlo? Gracias – Roey

2

Lo que sucede si se importa un archivo dll o tlb es que el preprocesador genera un tlh y un archivo tli. Si el tlb es estable, también podría generar los dos archivos e incluir el encabezado tlh como si fuera un encabezado normal.

Así que la respuesta es poner el #import donde pondría el encabezado porque se convierte en una inclusión del archivo tlh.

Lo uso de la siguiente manera para independizarme de la ubicación de MSADO15.dll y agregué el archivo tlh a mi subversión.

#ifndef __ADO__H 
#define __ADO__H 

#ifdef REBUILD_ADO_HEADER 
#import "C:\Programme\Gemeinsame Dateien\system\ado\MSADO15.DLL" rename_namespace("MyAdoNamespace") rename("EOF","EndOfFile") 
#else // REBUILD_ADO_HEADER 
#include "MSADO15.tlh" 
#endif // REBUILD_ADO_HEADER 

// Define ADO Namespace as global 
using namespace MyAdoNamespace; 

#endif // __ADO__H 
1

Además de los problemas de compilación que tiene, hay otros problemas con este diseño.

En general, las bibliotecas C++ no deben inicializar COM en hilos que no crea. Esto puede causar algunos efectos secundarios desagradables y difíciles de depurar. Considere actualizar la especificación de la interfaz de su biblioteca para indicar que el uso de ciertos métodos u objetos requiere que se inicialice COM. También debe especificar el modelo de subprocesamiento requerido (STA, Free).

Dicho eso, la otra cosa que debe tener en cuenta es llamar a CoUnitialize() antes de que su puntero inteligente salga del alcance. Esto también puede causar algunos efectos secundarios difíciles de depurar. Si está llamando a CoUnitialize() en el destructor de un objeto que contiene un puntero inteligente COM, deberá liberar y soltar explícitamente el puntero antes de invocar CoUnitialize().

¡Diviértete!

Cuestiones relacionadas