2011-04-29 80 views
1

这是我第一个SO问题! 我想实例化一个COM对象并将其转换为IDispatchEx,以便枚举其成员。这里有一个例子:如何在C#中实例化IDispatchEx?

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

我IDispatchEx是相同的一个on this website(不是我的网站),但GetNextDispID和GetMemberName返回一个int(我想描述on MSDN用于HRESULT)。

上述示例不起作用。有没有什么办法像从Active Scripting转换到IDispatchEx接口那样实例化COM对象?

感谢您的任何和所有帮助/建议!

回答

5

This operation failed because the QueryInterface call on the COM component for the interface with IID '{A6EF9860-C720-11D0-9337-00A0C90DCAA9}' failed due to the following error: No such interface supported (Exception from 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 coclass实现一个接口。我不希望很多COM类实现它,IDispatchEx是相当模糊的。它符合JScript模型。

+0

谢谢,汉斯。似乎也无法枚举使用IDispatch的属性/方法。我可能不得不以另一种方式去...... – aikeru 2011-05-03 13:48:26

+0

回到这里 - 我错了:)完全可以枚举使用IDispatch的后期绑定COM对象(实现它)。我仍然对此有所了解。 – aikeru 2012-06-18 15:46:27

0

看来你需要定义这个接口自己,如果你想在C#(source

This thread可能是相关的使用它 - 它似乎有人发现了一个现有的实现IDispatchEx的使用。