【发布时间】:2011-08-21 22:35:58
【问题描述】:
这确实是 Eric Lippert 或熟悉 JScript 引擎实现的 Microsoft 人员的问题。
我可以这样做吗:
var obj = new ActiveXObject("My.ProgId");
var methods = GetMethodsViaMagic(obj);
?
(假设COM类型支持IDispatch)
如果是这样,GetMethodsViaMagic() 是什么样的?
编辑 - 当然,我尝试的第一件事是for...in 循环,但这不适用于在 ActiveX 对象上定义的方法和属性。至少,不适用于我在 .NET 中定义并通过ComVisible 公开的对象。
在 C# 中,我可以这样定义 IDispatch:
[Guid("00020400-0000-0000-c000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDispatch
{
int GetTypeInfoCount();
System.Runtime.InteropServices.ComTypes.ITypeInfo
GetTypeInfo([MarshalAs(UnmanagedType.U4)] int iTInfo,
[MarshalAs(UnmanagedType.U4)] int lcid);
[PreserveSig]
int GetIDsOfNames(ref Guid riid,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames,
int cNames,
int lcid,
[MarshalAs(UnmanagedType.LPArray)] int[] rgDispId);
[PreserveSig]
int Invoke(int dispIdMember,
ref Guid riid,
[MarshalAs(UnmanagedType.U4)] int lcid,
[MarshalAs(UnmanagedType.U4)] int dwFlags,
ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
[Out, MarshalAs(UnmanagedType.LPArray)] object[] pVarResult,
ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
[Out, MarshalAs(UnmanagedType.LPArray)] IntPtr[] pArgErr);
}
然后我可以这样做:
var idispatch = (IDispatch) comObject ;
System.Runtime.InteropServices.ComTypes.ITypeInfo typeInfo =
idispatch.GetTypeInfo(0, 0);
System.Runtime.InteropServices.ComTypes.FUNCDESC funcDesc;
string strName, strDocString, strHelpFile;
int dwHelpContext;
typeInfo.GetFuncDesc(i, out pFuncDesc);// i = 1, 2, 3...
funcDesc = (System.Runtime.InteropServices.ComTypes.FUNCDESC)
Marshal.PtrToStructure(pFuncDesc,
typeof(System.Runtime.InteropServices.ComTypes.FUNCDESC));
...获取函数(方法)名称、参数个数等
我可以在 JScript 中为 ActiveX (COM IDispatch) 对象做类似的事情吗?
【问题讨论】: