2010-03-03 10 views
0

У нас есть файл IDL с несколькими интерфейсами, определенный, два из которых имеет коснуться, как это:В чем причина столкновения имен в файле 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 

он компилируется просто отлично.

Если мы переименуем любой метод, он также скомпилирует ok. Я бы не ожидал столкновения имен в двух разных интерфейсах, но это похоже на то, что происходит.

Мы можем исправить это, просто переименовав один из них, но я действительно хотел бы понять проблему. Может ли кто-нибудь объяснить это мне? Спасибо

ответ

2

Psychic debugging powerz говорит мне, что вы используете библиотеку типов в управляемом проекте. Импортщик библиотеки типов .NET (Tlbimp.exe) имеет непонятную ошибку, он неправильно использует метод или имя свойства, если он появляется более одного раза в библиотеке. Он использует капитализацию первого, с которым он сталкивается.

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

+0

Спасибо, ваши способности отладки phsyic поражают, что мы используем его в управляемом проекте C# (я бы включил эту информацию, если бы это перешло мне в голову, что это было важно), поэтому ваш ответ, вероятно, правильный. Спасибо, я попробую новый tlbimp. –

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^