我们有一个定义了多个接口的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
它编译得很好。
如果我们重命名任何一种方法,它也可以编译好。我不希望在两个不同的界面中发生命名冲突,但这似乎正在发生。
我们可以通过简单地重命名其中一个来修复它,但我真的很想了解这个问题。有谁可以帮我解释一下? 感谢
答案 0 :(得分:2)
Psychic debugging powerz告诉我你在托管项目中使用类型库。 .NET类型库导入程序(Tlbimp.exe)有一个模糊的错误,如果它在库中出现多次,它会不正确地将方法或属性名称大写。它使用了遇到的第一个大写字母。
第一种方法是忽略它,托管代码只能使用错误大小写的标识符。或者你可以升级导入程序,我很确定这个错误已在this one中修复。
答案 1 :(得分:0)
IDL似乎很好。结果类型库如何导入到您的应用中一定存在问题。
检查#import语句。是否有重命名属性将“SOMEMethod”更改为“SomeMethod”,或将ISomeInterface更改为IACompleteDifferentInterface?
查看#import自动生成的标头。你可能会在那里找到线索。