2014-10-10 5 views
2

У меня есть dll COM, который потребляется приложениями .NET с использованием COM Inter-op. В одном из CoClasses, есть интерфейс называется IT6TrackData и имеет один получить свойство TrackDataMIDL меняет имя интерфейса

Из файла IDL:

Interface IT6TrackData 
{ 
    [propget, id(1)] HRESULT TrackData([out, retval] SAFEARRAY(BYTE) *pVal); 
} 

Когда файл TLB рассматривается для указанного выше файла IDL, его показывает свойство как trackData (t в нижнем регистре) По какой-то причине приложение-клиент ссылалось на это свойство как trackData, и все работало нормально до сих пор.

В рамках усиления вышеуказанного интерфейса был обновлен, чтобы иметь свойство

Interface IT6TrackData 
{ 
    [propget, id(1)] HRESULT TrackData([out, retval] SAFEARRAY(BYTE) *pVal); 
    [propput, id(1)] HRESULT TrackData([in]SAFEARRAY(BYTE) pVal); 
} 

пут Теперь, когда файл TLB рассматривается для приведенного выше IDL файла, он показывает свойство как TrackData (т находится в верхнем регистре), это ломает старых клиентов .NET, которые продолжают ссылаться на trackData с «t» в нижнем регистре.

Я прошел через эту статью KB http://support2.microsoft.com/kb/220137/en-gb

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

ваше внимание оценивается.

IDL Файл

import "oaidl.idl"; 
import "ocidl.idl"; 

[ 
    object, 
    uuid(72867CE8-41B6-459E-A258-C7A162A26D5E), 
    dual, 
    nonextensible, 
    helpstring("ITFST6TrackData Interface"), 
    pointer_default(unique) 
] 
interface ITFST6TrackData : IDispatch{ 
    [propget, id(1), helpstring("property TrackData")] HRESULT TrackData([out, retval] SAFEARRAY(BYTE) *pVal); 
    [propput, id(1), helpstring("property TrackData")] HRESULT TrackData([in]SAFEARRAY(BYTE) pVal); 
}; 
[ 
    uuid(1D7ABC17-2738-4373-9B6B-239E344DBD21), 
    version(1.0), 
    helpstring("SampleCom 1.0 Type Library") 
] 
library SampleComLib 
{ 
    importlib("stdole2.tlb"); 
    [ 
     uuid(2013CC98-47A7-468F-912A-2A2CAE25E327), 
     helpstring("TFST6TrackData Class") 
    ] 
    coclass TFST6TrackData 
    { 
     [default] interface ITFST6TrackData; 
    }; 
}; 
+0

Вы пробовали добавить второй интерфейс? Возникает ли та же проблема? – rrirower

+0

даже после удаления недавно добавленного свойства put, он все еще отображается в T (верхний регистр) – user2101801

ответ

5

Это побочный эффект хака в генераторе библиотеки типов, встроенных в Windows. У этого есть обходное решение для проблем, вызванных нечувствительным к регистру языком. Которые могут объявлять тип в одном корпусе, но относятся к нему в другом месте в другом корпусе. Visual Basic является ярким примером такого языка.

Взлом очень грубый, он принимает корпус первого идентификатора, с которым он сталкивается, а затем меняет корпус любого последующего идентификатора для соответствия. Наиболее типичной причиной неожиданного изменения обсадной колонны является имя параметра, обычно пишется с первой буквой в нижнем регистре. Таким образом, у вас, вероятно, был параметр метода trackData в предыдущей версии кода.

И в вашей ревизии изменился либо порядок идентификаторов, либо вы переименовали или удалили этот параметр. Теперь вместо этого получим «TrackData».

Если у вас есть существующий клиентский код, который зависит от исходного корпуса, вы можете немного поменять корпус в своем источнике. Fugly fix, но неудивительно для ваших клиентов, так как они не могут отличить :)

+0

, можете ли вы объяснить «Fugly Fix», поскольку я не понял, что я сделал, изменил файл IDL, чтобы использовать строчный файл trackData , также изменил объявление функции и определение в .h и .cpp соответственно и перестроил, использовал TLB для генерации COM-операции dll, просматриваемой с помощью ILDasm, но все же свойство находится в верхнем регистре «TrackData» – user2101801

+0

Хе-хе, да. Удачи, охотясь на T-shark :) –

+0

хорошо, мне не повезло .... я сломал существующее клиентское приложение, и это очень плохо ... я не согласен с тем, что это ошибка в microsoft – user2101801

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

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