2

使用 VC2005,我有 3 个项目要构建:

  • libA(包含一个类型库,生成 libA.dll):IDL 有一行library libA { ...
  • libB(包含一个导入libA的typelib,结果是libB.dll):IDL有一行 importlib( "libA " );
  • libC(导入 libB):源文件之一包含#import <libB.dll>

由编译器按以下#import <libB.dll>方式处理(根据文档):

  1. 搜索 %PATH% 的目录
  2. 搜索 %LIB% 的目录
  3. 搜索“其他包含路径”(/I 编译器选项)

编译 libC 时,我可以看到 cl.exe 清楚地能够在可执行路径上找到 libA.dll(使用 Filemon.exe)

VC 错误 C4772: #import of typelib 与另一个依赖项

但是,仍然找不到 libA 命名空间,并且所有对 libA 类型的引用都替换为__missing_type__

(编辑)同时,我发现问题仅在使用调试 dll 时出现。

以前有人见过这个问题吗?并解决了?

4

4 回答 4

1

您是否明确设置项目的依赖项?换句话说,您是否在 IDE 中设置了解决方案,以便项目 C 依赖于项目 B,而项目 B 依赖于项目 A?

于 2008-09-26T14:19:16.187 回答
1

您是否使用 libC 中的 libA 中定义的类型?如果是这样,我认为您需要直接从 libC 导入 libA,以便它知道 libA 的类型。COM 不会自动引用其他类型库引用的类型库。

于 2008-10-26T21:41:36.297 回答
1

我没有给你答案,但我有过几次这样的经历,我想分享我所做的。

在几个不相关的项目中,我遇到了同样的情况。在一个案例中,我尝试了将近一周的时间来解决依赖关系,但最终我不得不减少损失以保持进度。我最终在 .tlh 文件上使用了 #include(在 DLL 上执行导入将生成这些),然后使用“经典 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 文件中的结构之一的示例。

于 2008-10-28T20:31:54.520 回答
1

终于找到了!

在 Visual Studio 项目中,LibA 中的 A.idl 文件的MkTypeLib Compatible设置为 ON。这推翻了从 A 项目继承的行为。更糟糕的是,它仅在 Debug 配置中为 ON。

结果是,对于每个

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

这导致tagE未在生成的类型库中定义。当 LibB 这样做时import( "A.dll" ),所有对 的引用tagE都被替换为__missing_type__...

于 2009-03-23T14:44:40.637 回答