间接Typelib未从Debug dll中很好地导入

时间:2008-09-26 14:03:55

标签: c++ visual-c++ import typelib

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

  • libA(包含一个类型库,导致libA.dll):IDL有一行library libA { ...
  • libB(包含导入libA的类型库,导致libB.dll):IDL有一行importlib( "libA " );
  • libC(导入libB):其中一个源文件包含#import <libB.dll>

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

  1. 搜索%PATH%的目录
  2. 搜索%LIB%的目录
  3. 搜索“其他包含路径”(/ I编译器选项)
  4. 编译libC时,我可以看到cl.exe显然能够在可执行文件路径中找到libA.dll(使用Filemon.exe)

    VC错误C4772:#lmport of typelib with another dependency

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

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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分: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文件中的一个结构的示例。

答案 3 :(得分: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__ ...