Salve a tutti!
Sto cercando di realizzare un tool di ripristino di Windows in VB ma ho un problema: voglio aggiungere una progress bar che mi indica l'avanzamento del processo di ripristino, ovvero l'applicazione dell'immagine .WIM alla partizione C:\, tramite il tool ImageX ovviamente. Ho letto che l'unico modo per farlo è utilizzare le librerie WIMGAPI.dll, ma visto che le mie conoscenze in VB sono decisamente scarse non ho idea di come procedere. Ho trovato del codice su internet ma non ho idea di come impiegarlo. E' questo:


  1. Private Declare Auto Function WIMCreateFile _
  2. Lib "C:\Program Files\Windows AIK\Tools\x86\wimgapi.dll" ( _
  3. <MarshalAs(UnmanagedType.LPWStr)> ByVal WIMPath As String, _
  4. ByVal AccessType As Integer, ByVal Creation As UInt32, _
  5. ByVal Flags As UInt32, ByVal Compression As UInt32, _
  6. ByRef CreationResult As Integer) As IntPtr
  7. Private Declare Auto Function WIMCloseHandle _
  8. Lib "C:\Program Files\Windows AIK\Tools\x86\wimgapi.dll" ( _
  9. ByVal Handle As IntPtr) As Boolean
  10. Private Declare Auto Function WIMApplyImage _
  11. Lib "C:\Program Files\Windows AIK\Tools\x86\wimgapi.dll" ( _
  12. ByVal hWnd As IntPtr, _
  13. <MarshalAs(UnmanagedType.LPWStr)> ByVal DestinationPath As String, _
  14. ByVal ApplyFlags As UInt32) As Integer
  15. Private Declare Auto Function WIMLoadImage _
  16. Lib "C:\Program Files\Windows AIK\Tools\x86\wimgapi.dll" ( _
  17. ByVal hWnd As IntPtr, _
  18. ByVal ImageIndex As UInt32) As IntPtr
  19. Private Declare Auto Function WIMSetTemporaryPath _
  20. Lib "C:\Program Files\Windows AIK\Tools\x86\wimgapi.dll" ( _
  21. ByVal hWnd As IntPtr, _
  22. <MarshalAs(UnmanagedType.LPWStr)> ByVal TemporaryPath As String) As Integer
  23. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  24. Dim intResult As Integer
  25. Dim ptrWIMHandle As IntPtr
  26. Dim ptrImageHandle As IntPtr
  27. ptrWIMHandle = WIMCreateFile("C:\test.wim", 8, 3, 0, 0, Nothing)
  28. WIMSetTemporaryPath(ptrWIMHandle, "C:\Temp")
  29. ptrImageHandle = WIMLoadImage(ptrWIMHandle, 1)
  30. intResult = WIMApplyImage(ptrImageHandle, "C:\WIMTemp", 0)
  31. 'intResult = 0 and GetLastWin32Error() = 4390
  32. MsgBox("Just applied image. result = " & intResult & vbCrLf & "Last Win32 error = " & GetLastWin32Error())
  33. WIMCloseHandle(ptrImageHandle)
  34. WIMCloseHandle(ptrWIMHandle)
  35. End Sub



A quanto ho capito per applicare l'immagine non posso utilizzare direttamente la funzione WIMApplyImage ma prima devo ottenere il percorso dell'immagine con WIMCreateFile, poi devo settare una cartella temporanea e infine utilizzare WIMApplyImage per applicare l'immagine.
Il fatto è che buttando dentro il codice in un Form vuoto e aggiungendo un pulsante "Button1" , se lo premo non accade nulla. Ovviamente prima mi sono assicurato che "WIMGAPI.dll" si trovasse nella giusta directory e che il file "C:\test.wim" esistesse.

Potete aiutarmi?

NB: Attualmente sto realizzando il software con VB 2008 Express ma la versione finale sarà in VB6 per problemi di compatibilità con .NET Framework, quindi mi piacerebbe trovare una soluzione funzionante su entrambi gli IDE.

Grazie in anticipo!