2008-09-26 100 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