拖放到卸载程序

时间:2015-05-17 16:49:45

标签: vb.net visual-studio-2013 drag-and-drop drag uninstall

如何连接这两种方法来创建一个简单的程序,我可以拖放程序在我的桌面上,或者在我的程序上,它将获得卸载路径并开始卸载处理。

所以我知道如何启用拖放功能

Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Me.AllowDrop = True
End Sub

Private Sub Form2_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
    Dim files() As String = e.Data.GetData(DataFormats.FileDrop)
    For Each path In files

        MsgBox(path)
    Next
End Sub

Private Sub Form2_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Me.DragEnter
    If e.Data.GetDataPresent(DataFormats.FileDrop) Then
        e.Effect = DragDropEffects.Copy
    End If
End Sub

我也知道如何获取程序的卸载路径

   Dim DestKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"

Registry.LocalMachine.OpenSubKey(DestKey).GetSubKeyNames

    UnInstallPath = Registry.LocalMachine.OpenSubKey(DestKey & App & "\").GetValue("UninstallString")

最后如何卸载软件

 Dim p As New Process
            p.StartInfo.FileName = "msiexec.exe"
            p.Start()

我的问题是我如何连接所有这些来实现我想要的东西。我似乎无法弄清楚如何将拖放连接到卸载过程

2 个答案:

答案 0 :(得分:0)

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\中的密钥名称是由每个产品使用的安装程序包生成的GUID或字符串。我不相信它们有任何约定,所以你不可能根据可执行文件的路径“猜测”其中一个。

你最好的选择是(可能)检索一个密钥列表,搜索每个密钥,直到找到包含与你拖放的可执行文件路径匹配的InstallLocation的密钥,然后使用该密钥UninstallString

请谨慎使用,因为可以将两个或更多程序安装到同一文件夹中。无论这种情况多么罕见,您可能希望完成搜索完整的密钥列表,以确保没有其他正面匹配。如果只有一场比赛,那么你很有可能找到了正确的钥匙;如果没有,您可能希望提示用户根据每个密钥DisplayName选择正确的密钥。

这看起来像是:

    'set path from your drag and drop operation
    Dim path As String = "C:\Program Files\Someones Crappy Unwanted Software\"
    Dim DestKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    Dim registryUninstallKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(DestKey)
    If (registryUninstallKey IsNot Nothing) Then
        Dim subKeys As String() = registryUninstallKey.GetSubKeyNames()
        Dim keyMatches As List(Of String) = New List(Of String)
        For Each subKey As String In subKeys
            Dim key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(DestKey & subKey & "\")
            If Not (key Is Nothing) Then
                Dim instLoc As String = Convert.ToString(key.GetValue("InstallLocation"))
                If (instLoc = path) Then
                    keyMatches.Add(subKey)
                End If
            End If
        Next
        For i As Integer = 0 To keyMatches.Count - 1
            'Do something with:
            Dim key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(DestKey & keyMatches(i) & "\")
            If (key IsNot Nothing) Then
                'This will capture the uninstall string for the selected key
                'Dim UnInstallString As String = key.GetValue("UninstallString").ToString
                MessageBox.Show(key.GetValue("UninstallString").ToString)
            End If
        Next
    End If

编辑:需要注意的另一件事是,并非每个密钥都有一个InstallLocation子密钥,因此您需要找到多种方法来搜索这些密钥以实际查找你在寻找什么,在某些情况下。不过,这个例子可以让你开始。

答案 1 :(得分:0)

这主要取决于你如何获得要卸载的产品列表。我将使用MsiEnumProductsEx()来获取已安装(通过Windows Installer)产品的列表,然后在每个产品上使用MsiGetProductInfo()来获取名称,版本,主安装位置等,并且该列表包含其每个ProductCode guid,所以要卸载它们做MsiConfigureProduct(ProductCode,默认,不存在)。或致电msiexec / x {productcode}。不使用这些Windows Installer产品中的uninstallstring条目,因此不要相信它。如果你想看看它是否有所作为改变它 - 它没有。

在这种情况下我使用适当的API而不是追逐注册表,因为有真正的实际API来执行这些操作(以及托管代码的互操作库)。对于非MSI安装,您需要查看注册表,但那里有很多废话,如果有的话,您将需要卸载字符串。