4

COM Inter-op を使用する .NET アプリケーションによって消費される COM dll があります。CoClasses の 1 つには、IT6TrackData というインターフェイスがあり、TrackData という get プロパティが 1 つあります。

IDL ファイルから:

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

上記の IDL ファイルの TLB ファイルを表示すると、プロパティが trackData ( t は小文字) として表示されます。何らかの理由で、クライアント アプリケーションはこのプロパティを trackData として参照しており、今まではすべて正常に機能していました。

強化の一環として、上記のインターフェイスは put プロパティを持つようにアップグレードされました

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

上記の IDL ファイルの TLB ファイルを表示すると、プロパティが TrackData (t は大文字) として表示されます。これは、小文字の「t」で trackData を参照し続ける古い .NET クライアントを壊しています。 .

この 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;
   };
};
4

1 に答える 1

6

これは、Windows に組み込まれているタイプ ライブラリ ジェネレーターのハッキングの副作用です。大文字と小文字を区別しない言語によって引き起こされる問題の回避策があります。あるケースで型を宣言しているが、別のケースでそれを参照している可能性があります。Visual Basic は、そのような言語の代表的な例です。

ハックは非常に粗雑で、最初に遭遇した識別子の大文字と小文字を区別し、その後の識別子の大文字と小文字を一致するように変更します。予期しない大文字と小文字の変更の最も一般的な原因は、通常、最初の文字が小文字で綴られているパラメーターの名前です。そのため、以前のバージョンのコードにはおそらく「trackData」メソッド パラメータが含まれていました。

また、リビジョンでは、識別子の順序が変更されたか、そのパラメーターの名前が変更または削除されました。代わりに「TrackData」を取得するようになりました。

元の大文字と小文字に依存する既存のクライアント コードがある場合、ソースの大文字と小文字を変更する以外にできることはほとんどありません。お粗末な修正ですが、クライアントは違いがわからないので驚くことではありません :)

于 2014-10-10T17:22:43.873 に答える