2012-07-24 77 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)來完成此操作。