是否可以在 winform 上使用 ocx(ActiveX 控件)(可能以编程方式添加它)而无需先向 regsrv32 注册 ocx?
我想要实现的是启用 xcopy 安装。我已经从我的开发机器生成了“AxInterop..dll ”和“Interop..dll”文件。
我已经看到了在不先注册它的情况下调用 COM dll 的可能性(ProSysLib,据作者说,但我还没有测试过),因为 ocx 也是基于 COM 的,因此我认为必须有一些方法也这样做。
是否可以在 winform 上使用 ocx(ActiveX 控件)(可能以编程方式添加它)而无需先向 regsrv32 注册 ocx?
我想要实现的是启用 xcopy 安装。我已经从我的开发机器生成了“AxInterop..dll ”和“Interop..dll”文件。
我已经看到了在不先注册它的情况下调用 COM dll 的可能性(ProSysLib,据作者说,但我还没有测试过),因为 ocx 也是基于 COM 的,因此我认为必须有一些方法也这样做。
是的,这是可以做到的。您必须假设您的应用程序将仅部署在 Windows XP(或 Windows Server 2003)或更高版本上,然后您可以使用所谓的“免注册 COM”来实现这一目标。
本质上,您所做的是为 ActiveX 控件 DLL 创建一个清单文件,以便 Windows 加载程序和 COM DLL 知道它的注册是什么,而不必将其放入注册表中。
MSDN 上的这篇文章中介绍了要执行的操作: COM 组件的免注册激活:演练
该文章中的“第 6 步”和“第 7 步”包含您需要的所有内容。
我刚刚在我自己的一个使用 Microsoft ActiveX 网格控件(旧的“MS Flex Grid”)的 C# 程序上进行了尝试,它工作得很好。确保为应用程序和 COM DLL 创建清单文件,并在正确的位置替换适当的 GUID。如果手边没有它们,您可能需要使用 OLEVIEW 从 ActiveX DLL 中找出要使用的正确 ID。
请注意,显然对在 .NET 中编写的 COM 组件使用无注册表 COM 可能会随机导致 Windows XP 上的崩溃!
链接:Stackoverflow question where I learn this, Microsoft 知识库文章在那个问题中提到。有一个修补程序,但您不能重新分发它。
在 Visual Studio 中甚至更简单:只需转到引用,找到您的 ocx 创建的位置(应该有 2 个,AxSomething 和Something)并为它们设置隔离:在它们的属性中为真。没有清单,没有代码。您现在应该使用包含 ocx 的 dll 文件分发您的 exe。在您的开发机器上,可以注册 ocx。
现在,有一个无法访问的点击站点解决方案的副本:mmm4vb6.atom5.com/yes-update-0-12-5479.html#c 在网络存档: http ://web.archive.org/web/20140828233304/ http://mmm4vb6.atom5.com/yes-update-0-12-5479.html
和上下文:
2013 年 4 月 7 日,星期日
虽然我不再那么积极地使用 VB6 进行日常工作,但在此过程中,我和我的同事们需要在修复错误后重新打包一些现有的应用程序,以应对不断变化的 Windows 环境。
自上一个版本发布以来,我们进行了一些更改,看起来不错。我决定发布此更新,但请注意,它尚未像大多数早期版本那样经过彻底的测试!
因此,请务必在发布之前彻底测试使用 MMM 0.12 打包的 MMM 应用程序。
有关详细信息,请参阅更改日志 (Related\MMMChangeLog.txt)。以下是显着的变化:
另一种改进/更正清单的 DPI-Aware 节点的尝试。更改 TLB 处理以防止它们被包含在内。运行时通常不需要 TLB。如果您确实需要包含它们,请通过添加文件自己添加它们,或者之后将它们复制到目标文件夹。试图应对最终导致 MMM 清单中出现“重复” coClass 条目的 Microsoft 补丁。更好地(我们希望)处理一些 VB6 提供的 OCX 中包含的不可创建类。我希望这能解决您在这些领域也可能面临的一些问题。当然,我希望这个版本不会破坏任何东西或以某种方式使事情变得更糟。
通过下载获取新版本:
发表于 2013 年 4 月 7 日星期日下午 2:59 ...
经过 10 个小时的搜索如何在 Win7 上使用 OCX 运行 VB6 应用程序而无需注册它和管理员权限,我在这里找到了一些点击解决方案:http: //mmm4vb6.atom5.com/yes-update-0-12-5479.html# C
需要检查嵌入清单以使其工作。像魅力一样工作!
我在这里发布解决方案,因为我在这里也发现了这个问题。
我通过以下方式将 ocx 转换为 dll
然后我将生成的 filename.dll 作为项目中的参考导入。
参考:https ://docs.microsoft.com/en-us/dotnet/framework/tools/tlbimp-exe-type-library-importer