2009-06-24 3 views
5

私はWindows環境とCOMプログラミングの初心者を考えてください。tlbファイルを使用したCOM自動化

アプリケーション(CANoe)へのアクセスを自動化する必要があります。 CANoeはCOMサーバとして自身を公開し、CANoe.h、CANoe_i.cおよびCANoe.tlbファイルを提供します。 アプリケーションのオブジェクトや関数にアクセスするためのC++クライアントの記述方法を指定することはできます。

また、C++からtlbファイルにあるコードにアクセスする方法を指定してください。

答えて

9

Visual Studioには、タイプライブラリをC++プロジェクトにインポートし、定義されたオブジェクトを使用するためのサポートが組み込まれています。また、それは実装ファイルは、プロジェクトとヘッダで構築されるようになります - これは、タイプライブラリをインポートし、そしてファイルと実装ファイルをヘッダーに変換します

#import "CANoe.tlb" 

:たとえば、あなたは#importディレクティブを使用することができますインクルードするファイルがあるので、これはまさに魔法のようなものです。

次に、型ライブラリに定義されている型とオブジェクトのためのスマートポインタラッパーのtypedefがたくさんあります。

ApplicationPtr app(__uuidof(Application)); 

これは、実行時に、コクラスアプリケーションは変数appに作成され、拘束されることに引き起こし、あなたでしょう:コクラスがあったが、インタフェースIApplicationを実装したApplicationと呼ばれる場合たとえば、あなたはこれを行うことができますそのようにそれを呼び出すことができます。

app->DoSomeCoolStuff(); 

エラー処理は、COM呼び出しの結果を確認し、必要に応じて適切な_com_error例外をスローすることによって行われていることはこれは、あなたが安全に例外を作成する必要がありますを意味します。

1

importディレクティブを使用して.tlbファイルをインポートします。これにより、COMコンポーネントによって公開されるインターフェイスと同等のC++が提供されます。

また、COMコンポーネントをレジストリに登録する必要があります(コンポーネントの.dllファイルのregsvr32を実行します)。その後、CoCreateInstance()(または通常より便利な_com_ptr_t :: CreateInstance())を呼び出して、インターフェイスを実装するクラスのインスタンスを作成することができます。次に、インターフェイスのメソッドを呼び出すことができます。これは、プレーンなC++インターフェイスとクラスの場合とほぼ同じように動作します。

+0

感謝。 私はアプリケーションのためのDLLファイルを持っていないので、このアプローチを好むでしょう。 ソースファイルの#import "CANoe.tlb"の後に続くコンパイルエラーが発生しました。 - 不明な文字 '0x1' - 構文エラー: ';'がありません。識別子 'A'の前に - 型指定子がない - が仮定されています。注:C++はdefault-intをサポートしていません - '{':関数形式のヘッダーがありません(古い形式の正式なリスト) いくつかの手順が不足している場合は、お勧めします。 .tlbファイルの内容を確認し、これらのエラーを解決する方法はありますか。 ありがとうございます –

+0

私はあなたがそれを解決しようとすると、あなたが管理しない場合は、十分な詳細を提供する別の質問をすることをお勧めします。 – sharptooth

0

簡単な方法は、#includeステートメントを使用して、.cppファイルに.hと_i.cプロジェクトの両方を含めることです。

dllが与えられておらず、tlbだけが提供されているので、Visual Studioの一部であるregtlibv12.exe(これはVS2005バージョン)を使用してtlbを登録できます。 tlbを登録すると、レジストリに適切なエントリが作成され、必要に応じてCOMライブラリ機能を使用できます。

編集:ちょっと、COMコンポーネントを正しくインスタンス化するには、とにかくDLLが必要です。インターフェイスポインタを作成するには

、より安全な方法の一つは次のようにCComPTRを使用することです:迅速な対応のためのすべての

 

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

 
+0

DLLを持っていなければ、コンポーネントをインスタンス化してクライアントプログラムをデバッグすることができなくなります。 – sharptooth

+0

はい、ただし、tlbファイルにはインタフェース定義のみが含まれており、別途登録する必要があります。 DLLについては正しいですが、コンポーネントをインスタンス化する必要があります。 – Aamir

+0

さて、あなたは、別々のtlb登録が可能であることは間違いありません。しかし、これはCOMコンポーネントに不完全なCOMサポートがあり、DllRegisterServerとDllGetClassObjectをサポートしていないときに通常使用される最後の手段です。 – sharptooth

関連する問題