3

相互に依存する一連の Visual C++ 9 COM コンポーネント プロジェクトがあります。

ComponentA はその typelib を に発行しますComponentA.tlb。ComponentB は にインポートComponentA.tlbComponentB.idlて公開しComponentB.tlbます。のメソッド シグネチャにComponentB.idlは、 で定義された型のパラメータが含まれていますComponentA.tlb。ComponentA と ComponentB の両方のプロジェクトは問題なくコンパイルされます。

ComponentC #imports both ComponentA.tlband ComponentB.tlbinto stdafx.h- これは突然失敗します

error C4772: #import referenced a type from a missing type library;

その後のセット

error C2440: 'return' : cannot convert from '__missing_type__ *' to '__missing_type__'

で定義された型を使用するラッパー用ComponentA.tlb。通常、それは登録されていないときに発生しますが、regeditでComponentA.tlb実行して登録されていることを確認しました。レジストリで指定されたパスに正確に存在します。regtlibComponentA.tlb

問題の原因と解決方法は?

4

2 に答える 2

2

私があなたと同じ問題を抱えているかどうかはわかりませんが、最初のビルドで C4772 エラーが発生し、2 回目のビルドで解消されました。

解決策は、ビルド前のステップとして A.tlb をプロジェクト ディレクトリにコピーし ("$(OutDir)\A.tlb ." をコピー)、リンク後のステップとして削除することでした。

私のプログラムは、A.tlb、次に B.tlb (A.tlb の型に依存します) で #import を実行します。A.tlb の #import は成功しましたが、B.tlb は失敗しました。どちらの TLB ファイルもインクルード ディレクトリにあり、基盤となる .DLL はいずれも regsvr32 に登録されていません (COM オブジェクトが登録されていれば、すべて正常に動作します)。

私が知る限り、#import ステートメントは C++ インクルード パスを尊重しません。これが、A.dll が登録されていないときに A.tlb を見つけることができなかった理由です。

于 2012-11-30T05:03:21.550 に答える
1

この問題は、ComponentA インターフェイスの変更に起因する可能性があるようです。タイプライブラリが登録されている間に ComponentA インターフェイスが変更されると、問題が発生し始めます。

RegisterTypeLib()私が使用する回避策は、ComponentA typelib の登録を解除してから再度登録することです。私は、それを呼び出す小さなプログラム (regtlib は typelib を登録解除できない) を作成しUnregisterTypeLib()、問題が解決したように見えます。

于 2010-12-10T09:58:07.030 に答える