0

我有一些想要注册的 VB6 .ocx 文件。这些 .ocx 文件将位于远程计算机上。

以编程方式注册这些 .ocx 文件的最佳方法是什么?

string arg_fileinfo = "/s" + " " + "\"" + "\\<remotemachine>\\<directory>\\<ocx>" + "\"";
Process reg = new Process();
//This file registers .dll files as command components in the registry.
reg.StartInfo.FileName = "regsvr32.exe";
reg.StartInfo.Arguments = arg_fileinfo;
reg.StartInfo.UseShellExecute = false;
reg.StartInfo.CreateNoWindow = true;
reg.StartInfo.RedirectStandardOutput = true;
reg.Start();
reg.WaitForExit();
reg.Close();

我没有收到任何错误,但它也没有注册 .ocx。有任何想法吗?

4

4 回答 4

1

如果要注册远程文件以在本地计算机上使用,在 UNC 路径上注册文件没有什么特殊要求,但您需要确保 UNC 路径或映射的驱动器仍然可供所有用户使用,尤其是正在运行的用户regsvr32。据推测,这将是本地管理员(默认情况下在 Windows Vista+ 上)将需要提升,这可能会断开网络连接。

另请注意,您的示例缺少\UNC 路径开头的额外内容。您的代码将导致arg_fileinfo包含/s "\<remotemachine>\<directory>\<ocx>".
您可以添加额外的\,或使用@装饰器,这样在输入 Windows 路径时会更清晰:

string arg_fileinfo = "/s \"" + @"\\<remotemachine>\<directory>\<ocx>" + "\"";

或者只是将它用于整个字符串和替代引号转义方法:

string arg_fileinfo = @"/s ""\\<remotemachine>\<directory>\<ocx>""";
于 2012-07-25T16:15:13.697 回答
0

几年前我不得不这样做。据我所知,UNC 名称不起作用,需要映射驱动器号。无论是严格意义上的 regsvr32 问题,还是由其他原因(例如 Windows 95)引起的,都在时间的迷雾中消失了。

于 2012-07-24T21:47:06.717 回答
0

将此作为您可以忽略的警告(因为我知道您无论如何都会这样做):

这样做不是一个好习惯。刚开始“从网络运行”PE 文件(EXE、DLL、OCX)需要为它专门链接,否则您可能会因间歇性网络中断而面临高网络活动和崩溃的风险。并且注册任何不在引导驱动器或至少本地硬盘驱动器上的东西无论如何都是不明智的。做任何这些在“不良做法”列表中排名靠前,尽管它似乎在大多数情况下都有效。

为什么不按照公认的做法进行正常部署?

我的猜测是,您正在进行大量的Mort开发,将某个程序的一个又一个版本拼凑在一起,希望其中一个最终会“坚持下去”。因此,您想将其中的一部分或全部转储到网络共享上,想着“安装?安装?我们不需要繁琐的安装。我只需将新文件放在那里,一切都可以毫不费力地神奇地工作。”

我假设您没有可用于通过组策略推送更新的托管网络,并且您没有创建必要的 MSI 安装程序包来处理其中的产品和升级代码。

一种替代方法是使用无注册 COM,它将为您解决很多小问题。

现在,您可以这样做而仍然忽略从网络共享运行的 PE 文件的危害,或者您可以使用小型启动程序绕过它。该启动器可以检查网络共享是否有新版本,如果找到,则在启动实际应用程序和终止之前将较新的文件复制到本地 PC。这基本上是一种自动更新的 XCopy 部署技术。

您可以根据需要变得花哨。例如,如果您的应用程序接受命令行参数,它可能会自行检查新版本,如果找到则启动小型更新程序(将命令行参数传递给它),然后终止。更新程序应用程序可以重新启动并将这些参数传递给新版本。

但是,是的,作为 Mort(甚至是正式的在职开发人员)的生活可能会很痛苦。即使您在托管的公司 LAN 环境中工作,也很难引起友好的邻里接线员的注意以正确地做事。如果您的应用程序不是某些经过高度设计的认可重大项目的一部分,那将是双倍的。

于 2012-07-25T16:54:57.337 回答
0

如果要注册文件以在远程机器上使用,则需要在该远程机器上运行代码。
您可以通过实际坐在计算机前、使用远程控制软件或远程管理工具(如psexec.exe )来执行此操作

于 2012-07-26T08:27:54.633 回答