2008-09-26 86 views
2

進口以及利用VC2005間接類型庫不,我有3個項目,以建立:從調試DLL

  • 力霸(包含一個類型庫,導致libA.dll):IDL中有一行library libA { ...
  • libB(包含一個類型庫導入LIBA,結果在libB.dll):IDL具有線importlib("libA ");
  • 的libC(進口libB):源文件中的一個包含#import <libB.dll>

#import <libB.dll>通過以下面的方式編譯器(如文檔)處理:

  1. 的%PATH%搜索目錄%LIB%
  2. 查詢的 「附加包含路徑」(的
  3. 搜索目錄/ I編譯器選項)

當編譯libC的,我可以清楚地看到,cl.exe時能夠找到libA.dll可執行文件路徑(使用FileMon.exe的)

VC兒上ROR C4772:與其它依賴類型庫的#進口

但是,仍然是力霸命名空間是發現和力霸類型的所有參考文獻都通過__missing_type__

(編輯)。同時,我發現這個問題只更換在使用調試DLL時出現。

之前有人看過這個問題嗎?解決了嗎?

回答

1

終於找到了!

在Visual Studio項目中,LibA中的A.idl文件將MkTypeLib兼容設置爲ON。這否決了從A項目繼承的行爲。更糟糕的是,它只在Debug配置中爲ON。

的結果是,每

typedef [public] tagE enum { cE1, cE2 } eE; 

這導致未在生成的類型庫中定義的tagE。當LibB做到了import("A.dll")時,所有對tagE的引用被替換爲__missing_type__ ...

1

您是否明確設置項目的依賴關係?換句話說,您是否在IDE中設置瞭解決方案,以便項目C取決於項目B,而項目B取決於項目A?

+0

最初,我有一個解決方案,其中包含所有三個項目以及依賴關係。這沒有奏效。現在我正在玩三個項目文件,使用devenv.com命令按順序逐個構建它們。 – xtofl 2008-09-26 14:21:54

1

您是否使用libC中定義的類型來自libC?如果是這樣,我認爲你需要從libC直接導入libA,以便它知道libA的類型。 COM不會自動引用其他類型庫自身引用的類型庫。

1

我沒有對你的答案,但我有過幾次這樣的經歷,我想分享我所做的。

在幾個不相關的項目上,我有你的相同的場景。爲了解決依賴關係,我嘗試了將近一週的時間,但最終我不得不削減自己的損失以保持按期進行。我最終在.tlh文件上使用了一個#include(在DLL上執行導入將生成這些文件),然後使用「classic com」API調用來獲取指向.tlh文件中結構的指針。代碼並不像使用包裝文件那樣乾淨,但它可以工作。

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指針:

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包裝模板從它的析構函數做得可靠釋放時,它超出範圍「去醜化」這是使用.tlh文件中某個結構的示例。

+0

感謝您的提示,但我會通過這一個...因爲#importing發佈DLL工作正常(即使對於調試版本)。 – xtofl 2009-01-29 21:04:06