0

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

它编译得很好。

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

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

4

2 回答 2

2

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

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

于 2010-03-03T16:45:29.553 回答
0

IDL 对我来说似乎很好。生成的类型库如何导入到您的应用程序中一定存在问题。

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

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

于 2010-03-03T16:10:16.470 回答