我有一个 Visual Basic 应用程序,如果安装运行不止一次,它往往会严重混乱。似乎偶尔客户端会在稍后将安装程序误认为是它的快捷方式,再次运行安装程序并将所有内容都搞砸了。我一生都无法弄清楚为什么,所以我决定最简单的方法是制作它,这样 exe 只能在机器上运行一次,否则它就会结束。有任何想法吗?
11 回答
您为什么不修复安装程序或正在发生的任何问题,而不是尝试进行一些黑客攻击来避免它...
只是我的 $.02
让您的安装程序在应用程序文件夹中放置一个文件。
再次运行时,检查该文件,如果存在,显示“已安装”弹出窗口并退出。
假设这是一个 VB6 问题,您可以使用内置的 App.PrevInstance。
文档: http: //msdn.microsoft.com/en-us/library/aa268085 (VS.60).aspx
如果您的应用程序已经在运行,App.Previnstance 返回 True。
在您的启动表单的加载事件或您的 Sub Main 中:
Private Sub Form_Load()
If App.PrevInstance = True Then
MsgBox "Already running"
'Do whatever you need to do before closing
End If
End Sub
如果您想更进一步,将前一个实例置于前台,您可以查看以下文章:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=21131&lngWId=1
如果您使用的是 .net,那么 Mutex 就是您的朋友。
永远不要使用 Process.GetProcessesByName 方法。您以后只会讨厌自己使用需要管理员权限的东西
private bool CanIStart
{
try
{
MyAppMutex= new Mutex(false, "myAppMutex", out createdNew);
if(MyAppMutex.WaitOne(0,false))
{
return true;
}
else
{
MyAppMutex = null;
return false;
}
}
catch(ApplicationException ex)
{
// we couldn't create the mutex. // log the error if you care
return false;
}
}
让安装程序创建一个注册表项。如果注册表项已经存在,则拒绝(再次)安装。
究竟如何实现这一点将取决于您使用的安装程序技术。
您可以让安装程序 EXE 文件自行删除,而不是在它运行时直接删除,而是在运行完成后将调用传递给另一个服务以将其删除。
我觉得这很有趣,所以我用谷歌搜索了一下,这篇文章似乎有一些很好的信息:
在安装程序应用程序上
' Test eventual mark, settings in the registry.
if GetSetting("MyInstallerApp","Startup","BeenHere",0) = 1 then
MsgBox "This installer was ran once already... first run the un-installer."
End ' or some other code to properly exit the installer
EndIf
Call SaveSetting ("MyInstallerApp","Startup", "BeenHere", 1) 'leave a mark for future
在卸载程序应用程序上(或安装程序的“卸载”选项)
' Allow future Installer to run again
Call DeleteSetting("MyInstallerApp", "Startup")
如果您将 VB.NET 与 Visual Studio 2005 或 2008 一起使用,您可以在项目设置的“应用程序”选项卡的“Windows 应用程序框架”部分中选中“制作单实例应用程序”选项。
您可以检查并查看已安装的应用程序文件是否已存在。假设是,您知道应用程序的安装位置。
也许检查机器上正在运行的进程以告诉您是否存在另一个实例会有所帮助?有关更多信息,请参阅此线程...
让我感到震惊的是,留下一个不应该多次运行的应用程序就像在某人的办公桌某处留下一个红色的大按钮,当按下时会炸毁桌子。不酷。
大多数安装程序具有不提供重复安装的功能。首先检查一下——这似乎是最好、最明显的解决方案。
什么情况严重?从您的应用程序的角度来看,第二次运行安装程序与第一次运行安装程序有何不同?这也应该在您的代码中得到解决。