0

複数のインターフェースが定義されたidlファイルがあり、そのうちの2つには次のようなものがあります。

[
     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);
}

これらは2つの完全に無関係なインターフェースであり、たまたま同じ名前の1つのメソッドがあります(ただし、示されているように大文字と小文字は異なります)。すべて問題ないようですが、次のようなプロジェクトをコンパイルしようとすると、

ISomeInterface -> SOMEMethod 

存在しないというエラーが表示されます。電話すれば

ISomeInterface -> SomeMethod 

それはうまくコンパイルされます。

どちらかのメソッドの名前を変更すると、コンパイルも正常に行われます。2つの異なるインターフェイスで名前の衝突が発生することはないと思いますが、それが起こっているようです。

そのうちの1つを名前変更するだけで修正できますが、問題を本当に理解したいと思います。誰かが私のためにそれを説明できますか?ありがとう

4

2 に答える 2

2

サイキックデバッグpowerzは、管理対象プロジェクトでタイプライブラリを使用していることを教えてくれます。.NETタイプライブラリインポーター(Tlbimp.exe)にはあいまいなバグがあり、ライブラリに複数回出現する場合、メソッドまたはプロパティ名を不適切に大文字にします。最初に遭遇したものの大文字化を使用します。

最初のアプローチはそれを無視することです。マネージコードは間違った大文字の識別子を使用する可能性があります。または、インポーターをアップグレードすることもできます。このバグはこのバグで修正されたと確信しています

于 2010-03-03T16:45:29.553 に答える
0

IDLは私には問題ないようです。結果のタイプ ライブラリがアプリにインポートされる方法に問題があるはずです。

#importステートメントを確認してください。「SOMEMethod」を「SomeMethod」に、または ISomeInterface を IACompleteDifferentInterface に変更する名前変更属性はありますか?

#import によって自動生成されたヘッダーを調べます。そこにヒントが見つかるかもしれません。

于 2010-03-03T16:10:16.470 に答える