2

我一直在尝试获取要从外部加载的参考文件,但无济于事。

具体来说,我正在尝试加载通常位于 C:\Windows\System32\MSCOMCT2.OCX 中的“Microsoft Date and Time Picker Control 6.0(SP4)”

但是,有些运行包含此元素的宏的人在他们的 PC 上没有“MSCOMCT2.OCX”文件,所以我想我会将 MSCOMCT2.OCX 移动到共享位置并引用代码以使用共享位置(所以每个人都可以访问它)

我尝试这样做,但是当我尝试使用“浏览”从其他位置加载引用时,它没有加载它 - 因为我已经在 C:..

所以我想好吧...我将从 C:\ 中删除该文件,因此我只能引用共享文件。- 所以我删除了它。所以我再次打开工作簿并查看参考资料——我找不到“Microsotft Windows Common Controls-2.6.0(SP4)”——太好了!然后我继续使用共享驱动器中的浏览手动添加它。但是,当我这样做时,将添加 2 个“Microsotft Windows Common Controls-2.6.0(SP4)”引用 - 1 个来自 C:\(不存在)和 1 个来自共享驱动器。

从 C:\ 自动添加的引用

还从共享驱动器添加了参考

C:\ 中的那个总是被自动选择。如果我尝试从 C:\ 禁用一个并从共享驱动器启用一个,它会自动更改回我按 OK 时的状态。如果我尝试同时启用两者 - 它会说重复的引用并只保留 C:\ 中的一个

所以..有人知道我怎样才能从列表中删除那个 C:\ 引用,这样它就不会被加载?显然删除文件本身不起作用。最终我的目标是让没有 C:\Windows\System32\MSCOMCT2.OCX 文件的人能够使用我的日期选择器工具。

非常感谢!

4

1 回答 1

6

ActiveX 控件引用始终基于 GUID。出于礼貌,VB IDE 会向您显示计算机注册表中列出的文件的当前位置,但实际上并不重要。该控件将从用户计算机上注册的任何位置加载。

这就是关键:控件必须在用户的计算机上注册。

我必须强烈劝阻你不要做你想做的事。您也许可以设计一种从网络位置加载 DLL 的方法,但它与做 Right Thing(TM) 相比没有任何优势,而且存在很多问题。正确的做法是,如果您需要该控件,您必须将其分发并注册到您的应用程序中,就像其他人一样。而且您确实应该将其安装在推荐的位置(System32);不在网络上。

下面是一个可能出错的简单示例:您向用户提供您的应用程序,它可以与网络上的控件一起使用,就像您想要的那样。然后用户安装另一个恰好需要相同控件的应用程序。应用程序的安装程序看到该控件已经在用户的计算机上注册,因此它不会尝试再次添加它。除了此特定应用程序旨在在用户未连接到网络时使用。现在你刚刚破坏了别人的程序。

VB/VBA 体系结构从未打算支持 XCOPY 部署。我知道这很痛苦,而且当您只是尝试部署“宏”时,这些额外的步骤非常不方便。可悲的是,这是野兽的本性。对不起

于 2013-04-05T12:39:49.553 回答