Что вызывает конфликт имен в файле IDL? - PullRequest
0 голосов
/ 03 марта 2010

У нас есть файл 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 ]

2 голосов
/ 03 марта 2010

powerz для отладки в экстрасенсе говорит мне, что вы используете библиотеку типов в управляемом проекте. Средство импорта библиотеки типов .NET (Tlbimp.exe) содержит неясную ошибку: оно неправильно использует заглавные буквы имени метода или свойства, если оно встречается в библиотеке более одного раза. Он использует заглавные буквы первого, с которым встречается.

Первый подход - игнорировать его, управляемый код может просто использовать идентификатор с неправильной заглавной буквой. Или вы можете обновить импортер, я уверен, что эта ошибка была исправлена ​​в этой .

0 голосов
/ 03 марта 2010

IDL мне кажется нормальным. Должна быть проблема с тем, как результирующая библиотека типов импортируется в ваше приложение.

Проверьте свои # import заявления. Есть ли атрибут переименования, изменяющий «SOMEMethod» на «SomeMethod» или ISomeInterface на IACompleteDifferentInterface?

Посмотрите заголовки, которые были автоматически сгенерированы #import. Вы можете найти подсказку там.

...