2009-06-24 19 views
5

Considerami un ambiente principiante per Windows e la programmazione COM.Automazione COM utilizzando il file tlb

Devo automatizzare l'accesso a un'applicazione (CANoe). CANoe si espone come server COM e fornisce file CANoe.h, CANoe_i.c e CANoe.tlb. Qualcuno può specificare come scrivere un client C++, per accedere all'oggetto, alle funzioni dell'applicazione.

Inoltre, specificare come accedere al codice presente nel file tlb da C++.

risposta

9

Visual Studio ha un sacco di supporto incorporato per l'importazione di librerie di tipi nel progetto C++ e l'utilizzo degli oggetti così definiti. Ad esempio, è possibile utilizzare la direttiva #import:

#import "CANoe.tlb" 

Ciò importare la libreria dei tipi, e convertirlo in file di intestazione e file di implementazione - anche causerà i file di implementazione per essere costruito con il progetto e l'intestazione file da includere, quindi questo è un sacco di cose magiche proprio lì.

Quindi, si ottiene un sacco di typedef per i wrapper di puntatori intelligenti per i tipi e gli oggetti definiti nella libreria dei tipi. Ad esempio, se ci fosse un CoClass chiamato Application che ha attuato l'interfaccia IApplication, si potrebbe fare questo:

ApplicationPtr app(__uuidof(Application)); 

Ciò causerebbe in fase di esecuzione, l'applicazione coclasse da creare e legato alla variabile app, e si possono telefonare in questo modo:

app->DoSomeCoolStuff(); 

la gestione degli errori è fatto controllando il risultato di chiamate COM, e gettando l'eccezione _com_error appropriata, se necessario, in modo da questo implica è necessario scrivere eccezioni in modo sicuro.

1

Utilizzare la direttiva import per importare il file .tlb - questo vi darà un equivalente in C++ delle interfacce esposte dal componente COM.

Sarà inoltre necessario registrare il componente COM nel registro (eseguire regsvr32 sul file .dll del componente). Dopodiché puoi chiamare CoCreateInstance() (o _com_ptr_t :: CreateInstance() come di solito è più comodo) per creare un'istanza della classe che implementa l'interfaccia. È quindi possibile chiamare i metodi dell'interfaccia: funzionerà quasi allo stesso modo di una semplice interfaccia e classe C++.

+0

Grazie a tutti per la risposta rapida. Non ho il file DLL per l'applicazione, quindi preferirò questo approccio. Ottenere i seguenti errori di compilazione, dopo #import "CANoe.tlb" nel mio file sorgente. - carattere sconosciuto '0x1' - errore di sintassi: mancante ';' prima dell'identificatore 'A' - specificatore di tipo mancante - int assunto. Nota: C++ non supporta default-int - '{': header funzione mancante (lista formale vecchio stile?) Si prega di suggerire, se mi manca qualche passo. Esiste un modo per verificare il contenuto del file .tlb e risolvere questi errori. Grazie in anticipo –

+0

ti suggerisco di provare a risolverlo e se non riesci a fare basta fare una domanda separata fornendo abbastanza dettagli. – sharptooth

0

Il modo più semplice è includere il progetto .h e _i.c nel file .cpp utilizzando le istruzioni #include.

Dato che non è stata fornita la dll e solo tlb è fornito, è possibile registrare il tlb utilizzando regtlibv12.exe che è una parte di visual studio (questa è la versione VS2005). Registrando tlb, le voci appropriate verranno inserite nel registro e quindi sarà possibile utilizzare le funzionalità della libreria COM come necessario.

MODIFICA: BTW, è necessaria comunque la DLL per creare un'istanza del componente COM correttamente.

Per creare un puntatore, uno dei modi più sicuri è quello di utilizzare CComPtr come:

 

CComPtr myPtr; 
myPtr.CoCreateInstance(__uuidof("ClassNamehere")); 
myPtr->Method(....); 

 
+0

Se non ha la DLL, non sarà in grado di creare un'istanza del componente e di eseguire il debug del suo programma client. – sharptooth

+0

Sì, ma è abbastanza probabile che il file tlb contenga solo definizioni di interfaccia e debba essere registrato separatamente. Hai ragione riguardo a DLL, anche se dovrebbe averlo per istanziare il componente. – Aamir

+0

Beh, hai ragione riguardo alla possibilità di registrazione separata. Ma è una pratica di ultima istanza solitamente utilizzata quando il componente COM ha un supporto COM incompleto e non supporta DllRegisterServer e DllGetClassObject. – sharptooth

Problemi correlati