【问题标题】:How Do I Prevent the Installer from Running when Application Data Files are Removed?删除应用程序数据文件时,如何防止安装程序运行?
【发布时间】:2011-08-31 16:32:50
【问题描述】:

我有一个使用 Visual Studio 2005 用 VB.Net 编写的应用程序。该应用程序允许用户创建和保存项目文件。当我分发应用程序时,我包含了一些演示项目文件,我将它们安装在公共应用程序数据文件夹中。

XP - C:\Documents and Settings\所有用户\应用程序数据

Vista & 7 - C:\程序数据

我发现了一个意外行为——如果公共应用程序数据文件夹中的任何文件被删除,并且应用程序从开始菜单运行,那么安装过程将启动并尝试恢复丢失的文件。如果 MSI 文件不再存在于其原始位置或已更改,则应用程序将无法运行。我认为这是一个“功能”,但这是我不想要的。谁能告诉我发生了什么以及如何避免它?

更多细节:

  • 我使用 Visual Studio 部署创建了安装包 项目。

  • 如果我直接启动 EXE,则不会发生此行为。一世 因此,期望该行为与 开始菜单快捷方式。我注意到快捷方式不是正常的 快捷方式——它没有“目标位置”。

感谢所有建议。

-TC

【问题讨论】:

    标签: visual-studio-2005 setup-project deployment-project advertised-shortcut


    【解决方案1】:

    我了解到这种行为涉及一种称为“按需安装”(又名“自我修复”)的东西。安装包创建的不寻常快捷方式称为“广告快捷方式”。现在我有了问题的名称,很容易找到有关如何解决它的信息。值得注意的是:

    这些页面包含大量信息。为了方便其他可能偶然发现这篇文章的人,我将总结他们所说的话:

    广告快捷方式是一些特殊的快捷方式,可以做一些花哨的事情。最值得注意的是,他们在启动目标之前重新安装损坏的应用程序。关于它们是善、恶还是无害存在一些争论。在我看来,他们做了大多数用户没想到的事情,这让他们变得邪恶。因此,我想为我的应用程序禁用它们。

    Visual Studio 安装项目会自动创建 MSI 包,默认情况下会生成广告快捷方式。在安装 MSI 程序包时,通过使用 DISABLEADVTSHORTCUTS=1 作为 Setup.exe 的命令行参数很容易覆盖该默认值。此外,使用像 Orca 这样的实用程序,您可以通过插入 DISABLEADVTSHORTCUTS=1 作为 MSI 的属性来手动更改默认值。但是,如果您希望 Visual Studio 自动创建不创建广告快捷方式的 MSI 包,那就更难了。我是这样做的:

    1. 首先,我使用 Gary Chang 在上述链接之一中提供的 DisableAdvt 代码创建了一个 VBS 文件(我在下面重复了该代码)。只需创建一个文本文件,粘贴代码。并将其保存为 DisableAdvt.vbs。

    2. 然后,为您的设置项目创建一个构建后事件。确切的语法将取决于您的文件位置。因为我的 DisableAdvt.vbs 位于解决方案文件夹的“工具”子文件夹中,所以我的构建后事件如下所示:

      • "$(ProjectDir)..\Tools\DisableAdvt\DisableAdvt.vbs" "$(BuiltOuputPath)"

    这就是我所要做的。它就像一个魅力。

    -TC

    一些注意事项:

    在 Visual Studio 2005 中,安装项目的构建事件的访问方式与其他类型的项目不同。在解决方案资源管理器中单击项目名称,然后在“属性”窗格中查找 PostBuildEvent。

    Orca 是一个实用程序,可用于手动将 DISABLEADVTSHORTCUTS 属性插入 MSI 文件。使用我的方法,不需要 Orca。但是,它对于验证构建事件是否正在进行预期的更改很有用。

    在构建事件中,拼写错误的“BuiltOuputPath”是故意的。

    这是 Gary Chang 的 DisableAdvt.vbs 代码(请注意,我在第 21 行修正了一个错字——非常重要!):

    Option Explicit
    
    Const msiOpenDatabaseModeTransact = 1
    Dim argNum, argCount:argCount = Wscript.Arguments.Count
    
    Dim openMode : openMode =  msiOpenDatabaseModeTransact
    
    ' Connect to Windows installer object
    On Error Resume Next
    Dim installer : Set installer = Nothing
    Set installer = Wscript.CreateObject("WindowsInstaller.Installer") :
    CheckError
    
    ' Open database
    Dim databasePath:databasePath = Wscript.Arguments(0)
    Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError
    
    ' Process SQL statements
    Dim query, view, record, message, rowData, columnCount, delim, column
    
    query = "INSERT INTO Property(Property, Value) VALUES ('DISABLEADVTSHORTCUTS', '1')"  
    Set view = database.OpenView(query) : CheckError
    view.Execute : CheckError
    
    database.Commit
    
    If Not IsEmpty(message) Then Wscript.Echo message
    Wscript.Quit 0
    
    Sub CheckError
      Dim message, errRec
      If Err = 0 Then Exit Sub
      message = Err.Source & " " & Hex(Err) & ": " & Err.Description
      If Not installer Is Nothing Then
        Set errRec = installer.LastErrorRecord
        If Not errRec Is Nothing Then message = message & vbLf & errRec.FormatText
      End If
    Fail message
    End Sub
    
    Sub Fail(message)
      Wscript.Echo message
      Wscript.Quit 2
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 2014-06-06
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多