ActiveX 初始化:AxHost.State 对象

Posted

技术标签:

【中文标题】ActiveX 初始化:AxHost.State 对象【英文标题】:ActiveX initialization: AxHost.State object 【发布时间】:2012-02-02 20:54:09 【问题描述】:

我正在尝试使用 WinFormsHost-Control 将 Unity3D-ActiveX 控件嵌入到 WPF-Form 中。

实际上在VS的属性窗口中设置路径时效果很好,但是在我的代码文件中设置时它不会加载任何东西。这是控件的一个已知问题,但我认为我可以简单地复制表单设计器的创建代码并手动初始化它。

查看初始化代码时,我注意到代码中没有src 属性,但该属性在属性窗口中使用。手动设置属性不起作用(引发错误)。

经过一些测试后,我决定检查src 属性的孔组件,但从未设置src 属性,我什至找不到路径的字符串。

最后的想法

我注意到src-path的位置只能有一个地方:窗体设计器生成的资源,是AxHost.State-type的对象。

问题

如何创建一个有效的AxHost.State 对象来初始化应该加载我指定的 Unity3D 文件的 Unity3D-ActiveX 控件?

【问题讨论】:

使用供应商的支持渠道寻求支持。 @HansPassant 我们在这里讨论的是AxHost.State 对象,而不是统一本身。状态对象由visual studio生成。 找到了一个可行的解决方案,但它只不过是一个 hack。我修改了已有的activeX对象的src路径,将状态保存在了一个局部变量中,处理了已有的ActiveX对象,利用已经保存在局部变量中的状态新建了一个。 【参考方案1】:

这是可行的解决方案,但有点慢(注意:您需要在表单设计器中初始化一次控件并将 OcxState 对象复制到程序集资源中):

// Create a ocx state object with the correct path
_Unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
((System.ComponentModel.ISupportInitialize)(_Unity)).BeginInit();
_Unity.OcxState = (AxHost.State)(Resources.Unity3DOcx);
_Unity.TabIndex = 0;
Controls.Add(_Unity);
((System.ComponentModel.ISupportInitialize)(_Unity)).EndInit();
_Unity.src = _File;
AxHost.State state = _Unity.OcxState;
_Unity.Dispose();

// Create the unity web player object
_Unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
((System.ComponentModel.ISupportInitialize)(_Unity)).BeginInit();
this.SuspendLayout();
_Unity.Dock = DockStyle.Fill;
_Unity.Name = "Unity";
_Unity.OcxState = state;
_Unity.TabIndex = 0;
Controls.Add(_Unity);
((System.ComponentModel.ISupportInitialize)(_Unity)).EndInit();
this.ResumeLayout(false);

【讨论】:

【参考方案2】:

如果你想在ActiveX Unity Web播放器的disableContextMenu属性中设置参数,你需要在你的程序中准备IPropertyBag.Read方法。

我制作了一个示例 C++ 程序 (Visual Studio 2010),它将“true”参数设置为 disableContextMenu 属性。见http://www.nibiirosoft.com/download/UnityActiveXSample.zip

使用这些代码,我为 .unity3d 文件 (http://www.nibiirosoft.com/Product/UniPlayer.html) 制作了一个播放器。

希望对你有帮助。

【讨论】:

【参考方案3】:

反编译dll“AxUnityWebPlayerAXLib”,直接在代码中添加src参数即可解决问题。

一切正常,但“disableContextMenu”仍有问题。

【讨论】:

添加了我的解决方案。我希望这有帮助。从未测试过 disableContextMenu 的东西...

以上是关于ActiveX 初始化:AxHost.State 对象的主要内容,如果未能解决你的问题,请参考以下文章

打开网页显示“该插件没有正常初始化”

剖析ActiveX控件安全问题

IE安全限制

是否可以将ActiveX对象标记为安全,以便不需要更改IE设置?

是否可以将 ActiveX 对象标记为安全以便无需更改 IE 设置?

怎么用js获取IE中ActiveX打印控件的打印机地址和名称