是什么导致IDL文件中的名称冲突?

时间:2010-03-03 15:31:09

标签: c++ com idl midl

我们有一个定义了多个接口的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 

它编译得很好。

如果我们重命名任何一种方法,它也可以编译好。我不希望在两个不同的界面中发生命名冲突,但这似乎正在发生。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

IDL似乎很好。结果类型库如何导入到您的应用中一定存在问题。

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

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