2011-03-14 106 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