在JScript中:我可以枚举通过新ActiveXObject()创建的对象的方法吗?

Che*_*eso 3 javascript activexobject

这对于Eric Lippert或熟悉JScript引擎实现的Microsoft人员来说确实是一个问题.

我可以这样做:

var obj = new ActiveXObject("My.ProgId");
var methods = GetMethodsViaMagic(obj);
Run Code Online (Sandbox Code Playgroud)

(假设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);
 }
Run Code Online (Sandbox Code Playgroud)

然后我可以做这样的事情:

    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));
Run Code Online (Sandbox Code Playgroud)

...并获取函数(方法)名称和参数数量等.

对于ActiveX(COM IDispatch)对象,我可以在JScript中执行类似的操作吗?

Eri*_*ert 6

首先,请记住,我已经十多年没有研究过JScript了.那个时候引擎发生了变化,我的记忆已经消失了.

在我的回忆和知识中:如果对象实现IDispatchEx,则for-in循环将起作用,但如果对象只实现IDispatch则不起作用.

我一直想添加一种机制,使JScript程序可以使用与调度对象关联的类型信息中可用的信息来枚举属性,但我不相信我实际上已经编写过代码.