2014-10-10 7 views
2

COM Inter-op를 사용하는 .NET 응용 프로그램에서 사용하는 COM dll이 있습니다. 그것을MIDL이 인터페이스 이름을 변경합니다.

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

TLB의 파일이 위의 IDL 파일을 볼 경우 : coclass에 하나에서 는 IT6TrackData라는 인터페이스가 있으며 하나는 IDL 파일에서 TrackData

라는 속성을 가져가 trackData (소문자 t)로 속성을 표시합니다. 어떤 이유로 클라이언트 응용 프로그램에서이 속성을 trackData로 참조하고 있었고 지금까지 모든 것이 제대로 작동했습니다.

인터페이스 상기 인핸스의 일부로서 이제 TLB 파일은 상기 IDL 파일을 볼 때 풋 속성

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

을 업그레이드하고, 그 TrackData (t 대문자에서와 같이 속성을 표시), 이는 소문자로 "t"를 사용하여 trackData를 계속 참조하는 이전 .NET 클라이언트를 손상시킵니다. 나는이 기술 자료 문서 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

이 윈도우에 내장 된 형식 라이브러리 생성기 해킹의 부작용이다. 대소 문자를 구별하지 않는 언어로 인한 문제 해결 방법이 있습니다. 하나의 케이스에 하나의 유형을 선언 할 수 있지만 다른 케이스의 다른 곳을 참조하십시오. Visual Basic은 이러한 언어의 대표적인 예입니다.

해킹은 매우 조잡합니다. 첫 번째 식별자의 케이싱을 취한 후 일치하는 모든 후속 식별자의 대소 문자를 변경합니다. 예기치 않은 케이스 변경의 가장 일반적인 원인은 일반적으로 소문자로 시작하는 문자의 철자가있는 매개 변수의 이름입니다. 따라서 이전 버전의 코드에는 "trackData"메서드 매개 변수가있을 것입니다.

그리고 개정판의 식별자 순서가 변경되었거나 해당 매개 변수의 이름이 변경되거나 제거되었습니다. 이제 "TrackData"가 대신 나타납니다.

기존 클라이언트 코드가 원본 케이스에 따라 다르면 할 수있는 일은 거의 없지만 소스에서 대소 문자를 변경하십시오. 그들은 차이를 말할 수 없기 때문에 못 견디기는하지만 고객에게 놀라지 마십시오.

+0

"Fugly Fix"를 설명 할 수 있습니까? 이해하지 못했고, 내가 한 일은 trackData의 소문자를 사용하도록 IDL 파일을 변경했습니다. , 또한 .h 및 .cpp의 함수 선언 및 정의를 변경하고 ILDasm을 사용하여 COM Inter-op dll을 생성하기 위해 TLB를 사용했지만 ILDasm을 사용하여 볼 수 있지만 여전히 대문자 "TrackData"에 있습니다. – user2101801

+0

Hehe, 예. 행운을 빌어 요 T- 상어를 사냥해라 :) –

+0

잘 나는 어떤 행운도 가지지 않고있다. .. 나는 기존의 클라이언트 응용을 깨었다. 그리고 그것은 매우 나쁘다. .. 나는 그들이 마이크로 소프트의 버그다고 인정할 것이다. – user2101801