1

これが私の最初のSO質問です!COMオブジェクトをインスタンス化し、IDispatchExにキャストして、そのメンバーを列挙できるようにします。次に例を示します。

    タイプ_COMType=System.Type.GetTypeFromProgID( "Scripting.FileSystemObject");
    var _COMObject =(IDispatchEx)Activator.CreateInstance(_COMType);

私のIDispatchExは、GetNextDispIDとGetMemberNameがintを返すことを除いて(私のWebサイトではなく)このWebサイトのものと同じです( MSDNで説明されているようにHRESULTに使用したい)。

上記の例は機能しません。Active ScriptingキャストからIDispatchExインターフェイスにキャストするようにCOMオブジェクトをインスタンス化する方法はありますか?

ありとあらゆる助け/提案をありがとう!

4

2 に答える 2

5

IID '{A6EF9860-C720-11D0-9337-00A0C90DCAA9}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが、次のエラーにより失敗したため、この操作は失敗しました: No such interface supported (HRESULT からの例外: 0x80004002 (E_NOINTERFACE)) .

表示される例外メッセージは非常に明確で、Scripting.FileSystemObject は単に IDispatchEx インターフェイスを実装していません。IDispatch のみ。これはうまくいきます:

        Type t = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
        var obj = Activator.CreateInstance(t);
        var iobj = (stdole.IDispatch)obj;

COM コクラスに強制的にインターフェイスを実装させることはできません。非常に多くの COM クラスがそれを実装するとは思わないでしょう。IDispatchEx はかなりあいまいです。JScript の型にはまります。

于 2011-04-30T19:27:48.567 に答える
1

C# で使用する場合は、このインターフェイスを自分で定義する必要があるようです ( source ) 。

このスレッドは関連している可能性があります - 誰かが使用する IDispatchEx の既存の実装を見つけたようです。

于 2011-04-29T16:02:21.487 に答える