64 位 visio 上不支持无窗口 ActiveX 控件异常

Posted

技术标签:

【中文标题】64 位 visio 上不支持无窗口 ActiveX 控件异常【英文标题】:Windowless ActiveX controls are not supported exception on 64Bit visio 【发布时间】:2013-04-23 11:17:27 【问题描述】:

我正在将我的应用程序的兼容性从 visio 32 位扩展到 visio 64 位。我在 win7(64) 机器上使用 visio 2013。我得到了不支持无窗口 ActiveX 控件的异常。我都试过了 KB 980533 和随 Visi SDK 一起提供的 Readme 示例文件,用于在此位置 \VisSDK\Samples\Readme Samples 64bit.htm 上为 64 位系统构建解决方案。我已经尝试过 DEP 解决方案,但无法正常工作。

堆栈跟踪:

   at System.Windows.Forms.AxHost.EnsureWindowPresent()
   at System.Windows.Forms.AxHost.InPlaceActivate()
   at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
   at System.Windows.Forms.AxHost.CreateHandle()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.AxHost.EndInit()

"无法获取 'AxDrawingControl' 控件的窗口句柄。不支持无窗口 ActiveX 控件。"

系统信息:

操作系统:Windows 7 64 位 Visio:Visio 2013 64 位 目标平台:.Net 4.5,任何 CPU 互操作:AxInterop.Microsoft.Office.VisOcx.dll(在 32 位机器上创建) Visio 绘图控件:VISOCX.DLL 64 位(是的,已注册) IDE:Visual Studio 2013 专业版

【问题讨论】:

【参考方案1】:

我终于找到了可以使用 64 位的解决方案。

神奇的是我意识到我实际上并不需要 XAML 中的控件;所以我最终做的是从 XAML 页面中删除控件,并从 .xaml.cs 代码的构造函数中对其进行实例化。

所以:按照this link 中的说明构建自定义控件。我认为您必须使用 64 位版本的 MSBuild.exe 进行构建,如 the link you provided 中所述。这显然仅在您创建自定义控件时才需要;我能够直接从 VS 构建解决方案(但它在由 MSBuild 构建时也可以正常工作,因此它也可以在自动构建中工作)。

创建自定义控件

    在安装了 32 位 Visio 的构建环境中创建一个名为 VisioAxControl 的新自定义控件项目 在 VS Designer 中,将 Visio 绘图控件从工具箱拖放到 WindowsFormsHost 内的窗体中。您可能需要将此控件添加到工具箱(右键单击工具箱,“选择项目...”)。执行此步骤会导致 VS 创建(并添加引用)一个新的 DLL,即 AxMicrosoft.Office.Interop.VisOcx 类型的“Microsoft Visio 15.0 绘图控件类型库”。这个DLL放在项目下的/obj/Release目录下,但是如果你简单地选择引用并将“Copy local”设置为“true”,就会在构建时复制到/bin。 打开代码隐藏并将控件的范围更改为public并重构:将其从axDrawingControl1重命名为AxVisioControl(最重要的是,不要忘记this.AxVisioControl.Name = "AxVisioControl";) 构建项目以创建用于最终 x86/32 位解决方案构建的 WPF 控制 DLL

    对于您的 x86/32 位解决方案,请将 VisioAxControl.dllAxMicrosoft.Office.Interop.VisOcx.dll 复制并引用到解决方案中某处的文件夹中。

    构建 64 位控件

    在安装了 64 位 Visio 的构建环境中保存、复制/移动和打开自定义控件项目

    将构建平台更改为 x64 打开管理员命令提示符,cd 到您的项目目录 运行MSBuild_Path\MSBuild.exe /p:Configuration=Release /p:Platform=x64 your_project_file_name(对我来说,MSBuild_Path是C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe)构建自定义控件项目来创建WPF控件DLL供最终x64使用解决方案构建

包含在您的 64 位项目中

    复制和引用/bin/Release/VisioAxControl.dll/obj/Release/AxMicrosoft.Office.Interop.VisOcx.dll。 在表单的 XAML 中,添加 <WindowsFormsHost name="MyWindowsFormsHost"></WindowsFormsHost> 控件。

    在 XAML 的代码隐藏中,在构造函数中:

    using VisioAxControl;
    public DesignView()
    
        InitializeComponent();
        var avc = new VisioAxControl()  Name = "vControl" ;
        this.MyWindowsFormsHost.Child = avc;
        this._avc = avc.AxVisioControl;  // for later reference, such as adding shapes
    
    
    保存并构建您的项目!

【讨论】:

以上是关于64 位 visio 上不支持无窗口 ActiveX 控件异常的主要内容,如果未能解决你的问题,请参考以下文章

求最新visio2016专业版激活码,win10 64位

在 SSE2 上进行无符号 64 位比较的最有效方法是啥?

安装visio,提示必须卸载所有32位的软件

cmd 执行Dcpromo错误:在该 SKU 上不支持 Active Directory 域服务安装向导,Windows Server 2008 R2 Enterprise 配置AD(Active D

无法安装64位office,因为您的PC上有32位

不能安装32位office提示已安装64位如何处理?