老化的32位OCX控件无法在.NET中加载

时间:2012-03-07 12:04:48

标签: .net visual-studio-2010 com 64-bit ocx

我正在开发一个依赖于老化的OCX控件的.NET应用程序。该控件提供终端界面,允许用户与航空公司预订系统进行交互。它已经在几个VB6应用程序中“成功”使用,但是我们需要/想要在.NET应用程序中使用它。

因此,在使用.NET 4和Visual Studio 2010的Windows XP(x86)盒子上,我创建了Winforms和WPF应用程序,这些应用程序使用已正确注册的控件。我已经实现了Reg Free COM并同时使用XCOPY和Click-Once,两个项目都可以成功部署到Windows XP(x86)计算机,并且两者都可以按预期工作,而无需注册控件。不幸的是,在Vista(x86)和Windows 7(x64)上进行部署时,同样不能说,应用程序启动但没有控制权。

为了解决这个问题,我尝试在Windows 7(x64)开发环境中注册控件。我试过了两个:

  • 使用普通的regsvr32(x64注册表)
  • 注册控件
  • 使用SysWOW64版本的regsvr32(x86注册表)注册SysWOW64目录中的控件

在这两种情况下,控件似乎都已成功注册,在一个全新的Winforms项目中,我可以将控件添加到工具箱中(图标显示等)。但是,只要我将控件拖到窗体上,它就会显示为窗体一角的一个小盒子(而不是XP上显示的终端窗口),甚至Interop文件的生成方式也与XP相同?! / p>

XP中的控件

Control in XP

选择时在Windows 7中看到的控件

Control in Windows 7

我花了很长时间在网上搜寻任何类型的解决方案或类似的问题都无济于事。欢迎任何建议!

更新1:

正如@DanielHilgarth所建议的那样,我使用控件在VB6中创建了一个基本应用程序并在Windows 7(x64)上运行它并且令人讨厌地获取已注册的COM组件并按预期工作,即使.NET应用程序或项目也是如此可以一起运行,没有看到控制!?

更新2

如果我使用控件在我的XP盒子上创建一个基本的Winforms应用程序(但需要注册控件,即不是免费注册)。当在我的Windows 7(x64)计算机上运行时,如果未注册控件将无法启动(按预期)。应用程序似乎无关紧要是控件是否在x86 / x64注册表中注册,无论是启动还是没有控制!?

更新3

我注意到如果我在Windows 7环境中运行Winforms项目(在XP和COM reg中创建),表单设计器将失败,除非控件注册(如预期)再次似乎不关心哪个注册表该组件已注册。一旦注册,将看到表单设计器(没有控件),并且在构建时会看到以下警告:

Windows 7 warnings

研究这个警告是徒劳的,似乎表明Visual Studio正在查找错误的注册表路径,但我找不到解决此问题的方法?

2 个答案:

答案 0 :(得分:1)

我认为我无法为您的问题提供答案,但也许我可以为您提供一些故障排除方法。

我只是猜测,但问题的根源可能是64位Windows上的32位注册问题,或者可能是权限问题,因为您正在使用UAC运行。要对最后一部分进行故障排除,您可以关闭UAC并查看是否有帮助。

64位Windows上的32位COM

我感觉到32和64位之间有点混乱。 64位Windwos上只有一个注册表。但是,COM组件是32位或64位。这意味着在64位注册表中需要有32位注册的单独区域,因此相同的注册可以有两种不同的实现(Wow6432Node)。

现在重要的一点是32位进程会看到注册表的修改版本,而不知道它。当COM组件注册CLSID时,它使用路径HKCR\CLSID而不知道它被映射到HKCR\Wow6432Node\CLSID。另一方面,如果要使用64位Regedit检查32位注册,则需要查看。但是,使用位于%systemroot%\syswow64\regedit.exe的32位Regedit可以更容易地解决64位上的32位注册问题,在那里您可以看到注册表,因为32位进程看到它。

您要使用的控件是本机32位控件,不会在64位进程中加载​​或运行。您写道“您正在使用正常的regsvr32(x64注册表)注册控件”,但这是不可能的。您应确保从32位角度正确注册控件及其所有依赖项。如果从64位角度查看注册,则需要完全了解Windows如何将注册表重新映射为32位(或者只是切换到32位Regedit)。

你显然想要使用免注册COM但在尝试之前你应该尝试看看你是否可以使用“旧学校”注册来解决你的问题。

免注册COM

我建议您阅读文章Registration-Free Activation of COM Components: A Walkthrough中的疑难解答部分:

  

在解决免注册COM问题时,事件查看器[...]是您的朋友

答案 1 :(得分:1)

好像问题出在DEP(数据执行保护)上。我假设OCX正在做不允许的事情!?

在运行各种测试Windows应用程序时,或者在注册控件时没有任何异常等,仍然令人费解。

为了纠正这种情况,我根据blog编辑了帖子构建。现在这意味着我可以调试并查看控件,当通过ClickOnce发布时,控件现在可以在所有操作系统上看到,即XP / Vista / Windows 7.

不幸的是,在设计时仍未看到控制,但我可以忍受!