【问题标题】:What causes name collision in an IDL file?是什么导致 IDL 文件中的名称冲突?
【发布时间】:2014-01-09 22:20:42
【问题描述】:

我们有一个定义了多个接口的 idl 文件,其中两个接口是这样的:

[
     object,
     uuid(79E24BAA-DC12-4caf-91DD-2A4D47FED30A),
     helpstring("ISomeInterface Interface"),
     pointer_default(unique)
]
interface ISomeInterface: IUnknown
{
     [propget, id(2)]
     HRESULT SOMEMethod([out, retval] BSTR* pValue);
};

[
    object,
    uuid(834421B6-511D-457D-B50C-69E7E1B65471),
    dual,
    nonextensible,
    helpstring("IACompleteDifferentInterface Interface"),
    pointer_default(unique)
]
interface IACompleteDifferentInterface : IDispatch
{
   [propget, helpstring("property SomeMethod")]
   HRESULT SomeMethod([out, retval] BSTR* pVal);
   [propput, helpstring("property SomeMethod")]
   HRESULT SomeMethod([in] BSTR newVal);
}

它们是两个完全不相关的接口,恰好有一个同名的方法(尽管如图所示具有不同的大小写)。 一切似乎都很好,但是当我们尝试编译一个调用的项目时

ISomeInterface -> SOMEMethod 

我们得到一个错误,说它不存在。如果我们调用

ISomeInterface -> SomeMethod 

它编译得很好。

如果我们重命名任一方法,它也可以编译。我不希望在两个不同的接口中发生命名冲突,但这似乎就是正在发生的事情。

我们可以通过简单地重命名其中一个来解决它,但我真的很想了解这个问题。谁能为我解释一下? 谢谢

【问题讨论】:

    标签: c++ com idl midl


    【解决方案1】:

    心理调试 powerz 告诉我您正在托管项目中使用类型库。 .NET 类型库导入器 (Tlbimp.exe) 有一个模糊的错误,如果方法或属性名称在库中出现多次,它会不正确地大写。它使用它遇到的第一个大写字母。

    第一种方法是忽略它,托管代码可能只是使用大小写错误的标识符。或者你可以升级导入器,我很确定这个错误已在this one 中修复。

    【讨论】:

    • 谢谢,您的物理调试能力令人震惊,我们在托管的 c# 项目中使用它(如果我想到它是相关的,我会包含该信息),所以您的回答可能是正确的。我会试试你建议的新 tlbimp,谢谢。
    【解决方案2】:

    IDL 对我来说似乎很好。将生成的类型库导入您的应用的方式一定有问题。

    检查您的 #import 声明。是否有重命名属性将“SOMEMethod”更改为“SomeMethod”,或将 ISomeInterface 更改为 IACompleteDifferentInterface?

    查看由#import 自动生成的标题。你可能会在里面找到线索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2017-01-28
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多