Jump to content

wimgapi.dll UDF - callback help - (Moved)


Recommended Posts

Hello everyone I know there are all kinds of WIM image programs out there for doing all kinds of things with WIM images.  I am working on my own that using the WIMGAPI.dll UDF (Thank you again for the UDF) I am able to get the core part of the Functions to work on creating WIM Images and capturing the files and folders.  The problem I am having is getting the DLL callback to work for progress status, Time left and current file.  The examples I keep finding are not working.  I'm not sure if that because the were made back in 2003 or what.  Here is what I have so far. 

 

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Wimgapi.au3> ; functions for WIM
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
Global $swimfile, $hWim, $hImage, $filepath, $Percent, $rTime, $pCallBack
;Global $gsWimDLL = @SystemDir & "\wimgapi.dll"
Global $gsWimDLL = @WindowsDir & "\system32\wimgapi.dll" ; path to wimgapi.dll
$ProgramName = "Backup Manager"



$aResult = _WIM_Startup()
If @error = 2 Then
    MsgBox(16, $ProgramName, "Error loading library: " & "(" & $aResult & "," & @error & ", " & $gsWimDLL & ")" & @CRLF & @CRLF & "The file could not be found.")
    Exit
ElseIf @error = 1 Then
    MsgBox(16, $ProgramName, "Error loading library: " & "(" & $aResult & "," & @error & ", " & $gsWimDLL & ")" & @CRLF & @CRLF & "Wrong DLL. Make sure you are using the right arch (x86/x64)")
    Exit
EndIf

Capt()

Func Capt()
    $swimfile=FileSaveDialog('Save WIM File', '', 'WIM File(*.wim)', 18)
    If @error Then
        Cleanup()
        Exit
    EndIf

    ProgressOn('Capture', '', '', -1, -1, 19)

    $pCallBack = DllCallbackRegister('CallBack', 'int', 'dword;WPARAM;LPARAM;dword')
    _WIM_RegisterMessageCallback(0, DllCallbackGetPtr($pCallBack), 0)

    ; first we need to create a blank .wim file with write access and our compression options
    $hWim = _WIM_CreateFile($swimfile, $WIM_GENERIC_WRITE, $WIM_CREATE_ALWAYS, 0, $WIM_COMPRESS_XPRESS, 0)
    If $hWim = 0 Then
        MsgBox(48, $ProgramName, "Error: Failed to create image. (" & $hWim & "," & @error & "," & @extended & ")")
        Cleanup()
        Exit ; image create failed
    EndIf

    ; set our temp path
    $aResult = _WIM_SetTemporaryPath($hWim, @TempDir)

    ; start the image capture!!!
    $hImage = _WIM_CaptureImage($hWim, @HomeDrive, 0)
    If $hImage = 0 Then
        MsgBox(48, $ProgramName, "Error: Failed to capture image. (" & $hImage & "," & @error & "," & @extended & ")")
        Cleanup()
        Exit ; image capture failed
    EndIf

    ; add our name and description to the XML data - ChrW(65279) is the BOM
    $sXML = ChrW(65279) & "<IMAGE><NAME>" & 'Test Name' & "</NAME><DESCRIPTION>" & 'Test Desc' & "</DESCRIPTION></IMAGE>"
    _WIM_SetImageInformation($hImage, $sXML)
    ;_WIM_SetBootImage($hWim, 1)
    Cleanup() ; free resources
    MsgBox(0, '', 'Done')

EndFunc   ;==>Capt

Func Cleanup()
    ; Cleanup any open handles
    If $hImage Then _WIM_CloseHandle($hImage)
    If $hWim Then _WIM_CloseHandle($hWim)
    If $pCallBack Then ; Cleanup our callbacks
        $aResult = _WIM_UnregisterMessageCallback(0, DllCallbackGetPtr($pCallBack))
        DllCallbackFree($pCallBack)
    EndIf
    _WIM_Shutdown() ; shutdown wimgapi.dll
EndFunc   ;==>Cleanup


; ==================================================================================================================
; Function: CallBack
; Description: Very Basic Sample Callback function for capture progress
; Usage:       CallBack($msgId, $param1, $param2, $B)
; Author:     Homes32
; ==================================================================================================================
Func CallBack($msgId, $param1, $param2, $unused)
    Local $Percent = 0, $sFilePath = 'nul', $rTime = 0
    Switch $msgId
        Case $WIM_MSG_PROGRESS ; get progress % and time remaining
            $Percent = $param1

            If $param2 = 0 Then
                $rTime = ""
            Else
                $rTime = StringFormat('Remaining: %i sec.', $param2 / 1000)
            EndIf
        Case $WIM_MSG_PROCESS ; get the file name being processed
            $Struct = DllStructCreate("ushort[1024]", $param1)
            $sFilePath = ""
            $i = 1
            While 1
                $Tmp = DllStructGetData($Struct, 1, $i)
                If $Tmp = 0 Then ExitLoop
                $sFilePath &= ChrW($Tmp)
                $i += 1
            WEnd
    EndSwitch
    ;GUICtrlSetData($Edit1, $sFilePath)

    ProgressSet($Percent, StringFormat('%3i%% completed.      %snn   %s', $Percent, $rTime, $filePath), 'Capture ' & $sWimFile)

    Return $WIM_MSG_SUCCESS
EndFunc   ;==>CallBack

 

WimConstants.au3 wimgapi.au3

Link to comment
Share on other sites

  • Moderators

Moved to the appropriate AutoIt General Help and Support forum, as the Developer General Discussion forum very clearly states:

Quote

General development and scripting discussions.


Do not create AutoIt-related topics here, use the AutoIt General Help and Support or AutoIt Technical Discussion forums.

Moderation Team

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...