【问题标题】:Best way to make it so an exe can only be run once最好的方法是让一个exe只能运行一次
【发布时间】:2012-05-04 10:39:50
【问题描述】:

我有一个 Visual Basic 应用程序,如果安装运行多次,它往往会严重混乱。似乎偶尔客户端会在稍后将安装程序误认为是它的快捷方式,再次运行安装程序并将所有内容都搞砸了。我一生都无法弄清楚为什么,所以我决定最简单的方法是制作它,这样 exe 只能在机器上运行一次,否则它就会结束。有什么想法吗?

【问题讨论】:

  • 您希望安装程序只运行一次 (1),还是应用程序本身运行 (2)?如果(1)那么你的问题的标题令人困惑,如果(2)那么你的问题本身就很难理解。

标签: vb.net vb6


【解决方案1】:

您为什么不修复安装程序或正在发生的任何问题,而不是尝试进行一些黑客攻击来避免它...

只是我的 $.02

【讨论】:

    【解决方案2】:

    让您的安装程序在应用程序文件夹中放置一个文件。

    再次运行时,检查该文件,如果存在,显示“已安装”弹出窗口并退出。

    【讨论】:

    • 那么该用户应该得到一个损坏的程序
    • 您最后安装标记文件,如果您担心用户可能不属于 Program Files 文件夹附近的任何位置,您可以将其命名为 DONOTDELETE.ME 或其他名称... 或者,您可以检查注册表以查看您的应用程序是否有标准卸载条目(添加/删除程序)
    【解决方案3】:

    假设这是一道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

    http://support.microsoft.com/kb/185730

    【讨论】:

    • 错过了问题的重点。它如何运行一次,而不是一次运行一次。 (并不是说运行一次是解决 OP 真正问题的方法)
    【解决方案4】:

    您可以让安装程序 EXE 文件自行删除,但不是在它运行时直接删除,而是在它运行完成后调用另一个服务来删除它。

    我觉得这很有趣,所以我在 Google 上搜索了一下,这篇文章似乎提供了一些不错的信息:

    http://www.autohotkey.com/forum/topic1572.html

    【讨论】:

      【解决方案5】:

      如果您使用的是 .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;               
                  }
      }
      

      【讨论】:

      • 互斥体没有用——他不是指并发实例。
      【解决方案6】:

      让安装程序创建一个注册表项。如果注册表项已存在,则拒绝(再次)安装。

      具体如何实现这一点取决于您使用的安装程序技术。

      【讨论】:

        【解决方案7】:

        在安装程序上

        ' 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")
        

        【讨论】:

          【解决方案8】:

          如果您将 VB.NET 与 Visual Studio 2005 或 2008 一起使用,您可以在项目设置的“应用程序”选项卡的“Windows 应用程序框架”部分中选中“制作单实例应用程序”选项。

          【讨论】:

          • 错过了问题的重点。它如何运行一次,而不是一次运行一次。 (并不是说运行一次是解决 OP 真正问题的方法)
          【解决方案9】:

          也许检查机器上正在运行的进程以告诉您是否存在另一个实例会有所帮助?请参阅this thread 了解更多信息...

          【讨论】:

          • 错过了问题的重点。它如何运行一次,而不是一次运行一次。 (并不是说运行一次就是解决 OP 真正问题的方法)。
          【解决方案10】:

          让我感到震惊的是,留下一个不应该多次运行的应用程序就像在某人的办公桌某处留下一个红色的大按钮,当按下它时会炸毁桌子。不酷。

          大多数安装程序具有不提供重复安装的功能。先检查一下 - 这似乎是最好、最明显的解决方案。

          什么是严重的混乱?从您的应用程序的角度来看,第二次运行安装程序与第一次运行安装程序有何不同?这也应该在您的代码中得到解决。

          【讨论】:

            【解决方案11】:

            您可以检查并查看已安装的应用程序文件是否已存在。假设您知道应用程序的安装位置。

            【讨论】:

              猜你喜欢
              • 2018-11-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-21
              • 2012-03-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多