如何连接这两种方法来创建一个简单的程序,我可以拖放程序在我的桌面上,或者在我的程序上,它将获得卸载路径并开始卸载处理。
所以我知道如何启用拖放功能
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()
我的问题是我如何连接所有这些来实现我想要的东西。我似乎无法弄清楚如何将拖放连接到卸载过程
答案 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安装,您需要查看注册表,但那里有很多废话,如果有的话,您将需要卸载字符串。