2

VC2005 を使用して、ビルドする 3 つのプロジェクトがあります。

  • libA (typelib を含み、libA.dll になります): IDL には次の行があります。library libA { ...
  • libB (libA をインポートする typelib を含み、libB.dll になります): IDL には次の行があります。 importlib( "libA " );
  • libC (libB をインポート): ソース ファイルの 1 つに#import <libB.dll>

これ#import <libB.dll>は、コンパイラによって次の方法で処理されます (ドキュメントによると)。

  1. %PATH% のディレクトリを検索
  2. %LIB% の検索ディレクトリ
  3. 「追加のインクルード パス」を検索します (/I コンパイラ オプション)。

libC をコンパイルすると、cl.exe が明らかに実行可能パスで libA.dll を検出できることがわかります (Filemon.exe を使用)。

VC エラー C4772: 別の依存関係を持つ typelib の #import

ただし、依然として libA 名前空間が見つから、libA 型へのすべての参照が置き換えられます。__missing_type__

(編集) 一方、デバッグ dll を使用している場合にのみ問題が発生することがわかりました。

この問題を以前に見た人はいますか?そしてそれを解決しましたか?

4

4 に答える 4

1

答えはありませんが、何度かこの経験をしたので、私がしたことを共有したいと思います。

いくつかの無関係なプロジェクトで、私はあなたの同じシナリオを持っていました。依存関係を解決するために1つのケースでほぼ一週間試みましたが、スケジュールを維持するために最終的に損失を削減する必要がありました。最終的に.tlhファイルで#includeを使用し(DLLでインポートを実行するとこれらが生成されます)、次に「classic com」API呼び出しを使用して、.tlhファイル内の構造体へのポインターを取得しました。コードは、ラッパーファイルを使用できる場合ほどクリーンに動作しませんが、動作します。

IUnknown *lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&lpUnk);
if (FAILED(hr)) throw SomeException;  

                                          //
_Application *app;                        //Address _Application  
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
lpUnk->Release();
if (FAILED(hr)) throw SomeException;  

                                          // Do stuff with the app object  
app->Release();                           // Then release

CComPtrラッパーテンプレートを使用して、スコープ外になったときにデストラクタから確実にリリースを実行することで、これをいくらか「非醜く」することができます。

CComPtr<IUnknown> lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)lpUnk);
if (FAILED(hr)) throw SomeException;  
                                          //
CComPtr<_Application> app;                //Address _Application  
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
if (FAILED(hr)) throw SomeException;
                                         //
                                         // Do stuff with the app object

_Applicationポインターは、.tlhファイルの構造の1つを使用する例であることに注意してください。

于 2008-10-28T20:31:54.520 に答える
1

プロジェクトの依存関係を明示的に設定していますか? つまり、プロジェクト C がプロジェクト B に依存し、プロジェクト B がプロジェクト A に依存するように、IDE でソリューションを設定しましたか?

于 2008-09-26T14:19:16.187 に答える
1

libC から libA で定義された型を使用していますか? もしそうなら、libC から libA を直接インポートして、libA の型を認識できるようにする必要があると思います。COM は、別のタイプ ライブラリによって参照されているタイプ ライブラリを自動的に参照しません。

于 2008-10-26T21:41:36.297 に答える