2011-03-14 109 views
0

我試圖找出一種方法來爲我正在處理的程序啓動一個啓動器/更新程序。它會註冊人員,不讓他們在未註冊的情況下運行主程序。所以說,我有launcher.exe和main.exe,然後打開main.exe。我需要它退出並打開啓動器。我打算使用套接字來做一個簡單的ping/pong類型處理,但是套接字在vb.net中打破了我的面孔,因爲我只在vb6中使用它們。VB.NET打開主exe文件時強制'啓動'應用程序?

對不起,牆壁的文字:)

+0

那麼,真正的問題是什麼? – 2011-03-14 08:47:05

+0

哈哈,我寫這個的時候我很累。我想知道是否有一種方法,只有從'啓動器'應用程序啓動時才能運行主應用程序。在正確的方向微調將是偉大的:) – Henzl0l 2011-03-14 13:50:18

回答

1

我建議使用「祕密」命令行參數。

當啓動器啓動主,它將執行

    C:\Path\Main -Launched

如果MAIN.EXE的用戶雙擊(或類型的「主」在DOS提示符),命令行參數將不會被看到。因此,在Main中,如果命令行沒有-Launched參數,則它會啓動Launcher,然後退出。如果它具有-Launched參數,則可以假定它由啓動器應用程序啓動並繼續。


唯一的缺點這是一個黑客可以重命名MAIN.EXE到Main2.exe,然後自己安裝MAIN.EXE其中顯示了命令行版本,然後啓動MAIN2。這將允許他們看到「祕密」命令行參數。但即使是大多數黑客也不會爲此而煩惱,而且非黑客永遠不會看到這個參數。但是,如果你擔心這個,你可以這樣做,而不是:

(注:沒有測試,可能會有輕微的排字錯誤這裏)

' In Launcher: 
' ... 
Dim Param as string = Now.ToString("MMddhhmmss").GetHashCode.ToString 
' Now launch Main, using Param as the command-line parameter 
' ... 


' Somewhere in Main, probably in the main form's Form1_Load: 
' ... 
Dim H As Integer = 0 
Integer.TryParse(Command, H) 

Dim T As Date = Now 
Dim Launched As Boolean = False 
For I As Integer = 0 To 30 
    Dim X As Integer = T.AddSeconds(-I).ToString("MMddhhmmss").GetHashCode 
    If X = H Then 
     Launched = True 
     Exit For 
    End If 
Next I 

If Not Launched Then 
    ' Assume that user launched program directly 
    ' Start Launcher, then exit 
End If 

' The program was started from Launcher. Continue. 
' ... 

這代碼假設當Launcher啓動Main時,Main的代碼在30秒內開始執行。 (如果這證明是錯誤的,你可能需要增加I循環中的最大值。)

+0

我用這個想法,它的作品像一個魅力:)我不是真的厭倦了黑客,所以它是完美的。如果我擔心,我不會在VB.Net中做這件事; D感謝您的幫助:) – Henzl0l 2011-03-20 10:59:53

1

我會扭轉整個事情。與其啓動主程序並讓其使用更新程序切換遊戲,請將「主」圖標和程序名稱分配給更新程序,並在啓動時檢查並更新真正的主程序。然後它會在退出之前啓動您的真實應用程序。這樣只有一個開關而不是兩個開關。

Savy用戶將能夠直接找到並運行真實的.exe文件,但絕大多數它只是隱藏在程序文件文件夾中的另一個文件。

另一種選擇是讓你的主程序是一個dll(類庫項目)而不是一個.exe文件,並在啓動後使用Assembly.LoadFile()函數動態加載它。只要進入該dll的入口點保持一致,這是安全的,並且使用戶難以直接運行主程序而不使用更新程序。

+0

@@ Joel,我非常喜歡DLL的想法。基本上整個程序都可以在DLL中,而.EXE除了更新它並啓動它之外什麼也不做。我希望我能想到這一點。 – 2011-07-21 00:10:04