2012-07-24 86 views
0

我有一些VB6 .ocx文件,我想注册。这些.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。有任何想法吗?

+0

是否要在本地计算机上注册远程文件或在远程计算机上注册远程文件? – Deanna 2012-07-25 08:42:58

+1

哎哟,哎。 “DLL地狱”来了。不要这样做。许多库是共享的,还有其他一些需要注册表更新的事情,例如使用次数和其他卸载信息,您需要检查它们是否已经存在,版本等等。您可能会破坏用户的其他应用程序。使用适当的部署包。 “这些是私人OCX”是一个糟糕的借口。 – Bob77 2012-07-25 13:58:29

+0

@BobRiemersma - 这只是这一过程中的一步。我会复制一个“新”.ocx,这是我想要重新注册的那个。 – webdad3 2012-07-25 15:08:00

回答

0

以此为你完全可以不理会警告(因为我知道你会这样):

这样做是不是一个好的做法。仅仅从“从网络运行”开始,PE文件(EXE,DLL,OCX)需要专门链接,否则会由于间歇性网络中断而导致高网络活动和崩溃。而注册任何不在启动驱动器或至少本地硬盘驱动器是不明智的。尽管它在大多数情况下似乎有效,但在“不良做法”列表中排名居前列。

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

我的猜测是你正在做很多Mort开发,在一些程序的版本后面拼凑版本,希望其中一个最终会“坚持”。因此,您想将部分或全部文件转储到网络共享上,并认为“安装?安装?我们不需要任何安装。我可以将新文件放在那里,让所有的东西都可以毫不费力地工作。”

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

另一种选择是使用免reg-COM,它将为您解决很多小问题。

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

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

但是,作为莫特(或者甚至是一名官方在职薪酬开发人员)的生活可能会很痛苦。即使您在托管公司局域网环境中工作,要使friendly neighborhood box jockeys正确执行操作也非常困难。如果你的申请不是一些highly engineered被批准的重大项目的一部分,那么这会增加一倍。

+1

感谢鲍勃我欣赏这种见解。编码时,我试图遵循“不伤害”的口头禅。我试图建立一个实用程序来帮助开发人员在将.ocx文件移动到开发机器进行测试时提高生产力。我会接受你的建议并谨慎行事。 – webdad3 2012-07-25 17:11:11

0

几年前我不得不这样做。尽我所能记住,UNC名称不起作用,需要映射驱动器号。无论是严格的regsvr32问题,还是其他问题(例如Windows 95)引起的问题,都会在时间的迷雾中迷失。

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>"""; 
+0

以及我看到一个消息框,指出ocx已经注册(我拿出了/ s),但是,当我在远程机器上尝试时,ocx仍然没有注册。 – webdad3 2012-07-25 16:57:45

+0

你是什么意思“当我在远程机器上尝试它”?你只注册它在你的本地机器上使用(但托管在远程机器上),这就是为什么我澄清了你以后的内容。 – Deanna 2012-07-26 08:22:06

0

如果您想注册文件以在远程机器上使用,您需要在该远程机器上运行代码。
您可以通过身体坐在电脑前,使用远程控制软件或远程管理工具(如psexec.exe)来完成此操作。