Javascript ActiveX";类不';“不支持自动化”;

Javascript ActiveX";类不';“不支持自动化”;,javascript,.net,activex,Javascript,.net,Activex,这是我第一次尝试ActiveX控件(有了这次经验,这将是我最后一次尝试)。在高层,当我尝试使用一个方法时,我会得到一个控制台错误,上面写着“类不支持自动化” 我创建了一个自定义ActiveX控件,通过MSI安装,并试图在MVC应用程序中使用它。接口定义为: [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] [Guid("7EC603C3-3FB9-4E8B-A5B8-4D5804511E15")] publi

这是我第一次尝试ActiveX控件(有了这次经验,这将是我最后一次尝试)。在高层,当我尝试使用一个方法时,我会得到一个控制台错误,上面写着“类不支持自动化”

我创建了一个自定义ActiveX控件,通过MSI安装,并试图在MVC应用程序中使用它。接口定义为:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("7EC603C3-3FB9-4E8B-A5B8-4D5804511E15")]
public interface IPrinter
混凝土等级:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("1F668100-532A-4077-BEDE-1610AF2CC6DF")]
[ProgId("AxControls.Printer")]
[ComDefaultInterface(typeof(IPrinter))]
public class Printer: IPrinter, IObjectSafety
IObjectSafety接口和实现:

[ComImport]
[Guid("34ABF5FA-1991-4D53-81BF-7DC7E3EFD8F6")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
    [PreserveSig]
    int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions);

    [PreserveSig]
    int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions);
}

    public int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
    {
        const ObjectSafetyOptions options = ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_CALLER | ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_DATA;
        pdwSupportedOptions = (int)options;
        pdwEnabledOptions = (int)options;

        return 0;
    }
    public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
    {
        return 0;
    }

    [Flags]
    public enum ObjectSafetyOptions
    {
        INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001,
        INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002,
        INTERFACE_USES_DISPEX = 0x00000004,
        INTERFACE_USES_SECURITY_MANAGER = 0x00000008
    };
还有我的JavaScript:

var ax = new ActiveXObject("AxControls.Printer");
ax.Print(JSON.parse(data.obj), "NameOfPrinter");
错误发生在第二行JS上。我用的是IE 11。在代码中单步显示控件已正确加载。如果我把论点改为无效,我会得到一个不同的信息,让我相信它们是正确的,不是问题所在


非常感谢您的帮助。

我在一台远程机器上也遇到了这个错误,我无法访问。我发现一些链接提到您需要重新注册一些DLL,但不确定它们是否解决了这个问题。如果你尝试这样做,它能解决你的问题吗

在命令提示符下运行:

regsvr32 msscript.ocx

regsvr32 dispex.dll

regsvr32 vbscript.dll

regsvr32 scrrun.dll

regsvr32 urlmon.dll

通过使用以下命令注册,我成功地使用了ActiveX控件:

regasm /codebase [path to DLL]

参考资料:

没有直接关系,但我发现IObjectSafety的Guid存在一个问题。请参阅link:在本例中,它不喜欢为Print()的第一个参数传递JSON。相反,我传递data.obj(序列化的obj),然后在我的控件中反序列化。这纠正了行为,尽管我仍然想知道这是一个问题的确切原因。