2015-05-17 6 views
0

Как подключить эти два метода для создания простой программы, где я могу перетащить программу на мой рабочий стол или где-нибудь в мою программу, и она получит путь удаления и начнет процесс удаления.Перетащите, чтобы удалить программу

Так что я знаю, как включить перетаскивание

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

Ключами в 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 

Edit: Другое дело, следует отметить, что не каждый ключ будет иметь InstallLocation подключ, так что вам нужно найти сочетание способов поиска с помощью эти ключи фактически находят то, что вы ищете, в некоторых ситуациях. Однако этот пример должен начать работать.

+0

Эй, спасибо за это, у меня есть последний вопрос: как мне получить место установки из перетаскивания? все, что я могу получить, это путь, где расположен значок, например C: \ Users \ example \ Desktop \ software.ink – Bluezap

+0

Вот пример способа получить цель из ссылки: http://stackoverflow.com/ вопросы/9454836/vb-net-c-sharp-code-to-access-target-path-of-link-lnk-files-производит-some-wr –

+0

Пожалуйста, посмотрите на решение ниже, я столкнулся с ошибкой – Bluezap

0

В основном это зависит от того, как вы получаете список продуктов для удаления. Я бы использовал MsiEnumProductsEx(), чтобы получить список установленных (через Windows Installer) продуктов, а затем использовать MsiGetProductInfo() для каждого из них, чтобы получить имена, версии, основное место установки и т. Д., И этот список включает в себя каждый из своих кодов ProductCode, поэтому для их удаления MsiConfigureProduct (ProductCode, по умолчанию, отсутствует). Или вызовите msiexec/x {productcode}. Запись uninstallstring в этих установщиках Windows Installer не используется, поэтому не доверяйте ей. Измените его, если вам нравится, если это имеет значение - это не так.

В этом случае я использую соответствующие API, а не преследую реестр, потому что для этого используются реальные API-интерфейсы (и библиотеки interop для управляемого кода). Для установок, отличных от MSI, вам нужно будет посмотреть реестр, но там много ерунды, и вам понадобится деинсталляция для них, если таковая есть.

 Смежные вопросы

  • Нет связанных вопросов^_^