用DELPHI利用wimgapi.dll捕获制作、解开应用 提取导出(这三个模块中)显示当前文件数进度的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 宋阳
  • 开始时间 开始时间

宋阳

Unregistered / Unconfirmed
GUEST, unregistred user!
1、在捕获(制作)WIM映像过程中,在显示出进度条前,有一个沉默期,其实这时在内部正在扫描捕获的文件,问题是在这个沉默期间如何不让它沉默而显示出扫描的进度-----即当前的文件数和文件夹数。<br><br>2、在进度条显示时如何同时显示当前有多少文件已被捕获制作(或已应用、或已提取导出)。<br><br>3、在应用解开这个模块运行显示出进度条时,如何同时显示当前用了多少时间、余下多少时间及当前已应用解开的文件数。<br><br>须资料如WIMGAPI.dll,&nbsp;WIMGAPI.chm,WIMMaster.txt(外国人的VC++.NET代码),另一个国外网友写的工具GImagex.EXE,wimgapi.h及wimgapi.h在DELPHI中的申明;尽管提出,都可提供.
 
我把WImgApi.h翻译了一下,匆匆忙忙,没作检查。<br>下面是根据微软范例改写的一个小例子,你看看吧<br><br>
代码:
unit&nbsp;Unit25;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs,&nbsp;StdCtrls,&nbsp;ComCtrls;<br><br>type<br>&nbsp;&nbsp;TForm25&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;&nbsp;&nbsp;Memo1:&nbsp;TMemo;<br>&nbsp;&nbsp;&nbsp;&nbsp;Button1:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;Button2:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;ProgressBar1:&nbsp;TProgressBar;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Button1Click(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Button2Click(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Private&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Public&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;Form25:&nbsp;TForm25;<br><br>implementation<br><br>{$R&nbsp;*.dfm}<br><br>uses<br>&nbsp;&nbsp;WImgApi;<br><br>//Callback&nbsp;function:<br>//<br>function&nbsp;SampleCaptureCallback(<br>&nbsp;&nbsp;&nbsp;&nbsp;msgId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;message&nbsp;ID<br>&nbsp;&nbsp;&nbsp;&nbsp;param1&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WParam;&nbsp;&nbsp;&nbsp;//&nbsp;usually&nbsp;file&nbsp;name<br>&nbsp;&nbsp;&nbsp;&nbsp;param2&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;LParam;&nbsp;&nbsp;&nbsp;//&nbsp;usually&nbsp;error&nbsp;code<br>&nbsp;&nbsp;&nbsp;&nbsp;UserData&nbsp;&nbsp;:&nbsp;Pointer<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;DWORD;&nbsp;stdcall;<br>var<br>&nbsp;&nbsp;Msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;PWideChar;<br>&nbsp;&nbsp;FilePath&nbsp;&nbsp;:&nbsp;PWideChar;<br>&nbsp;&nbsp;Percent&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;ErrorCode&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;Msg_Back&nbsp;&nbsp;:&nbsp;PDWORD;<br>begin<br>&nbsp;&nbsp;//first&nbsp;parameter:&nbsp;full&nbsp;file&nbsp;path&nbsp;for&nbsp;if&nbsp;WIM_MSG_PROCESS,&nbsp;message&nbsp;string&nbsp;for&nbsp;others<br>&nbsp;&nbsp;Msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;PWideChar(param1);<br>&nbsp;&nbsp;filePath&nbsp;:=&nbsp;PWideChar(param1);<br>&nbsp;&nbsp;percent&nbsp;&nbsp;:=&nbsp;param1;<br><br>&nbsp;&nbsp;//second&nbsp;parameter:&nbsp;message&nbsp;back&nbsp;to&nbsp;caller&nbsp;if&nbsp;WIM_MSG_PROCESS,&nbsp;error&nbsp;code&nbsp;for&nbsp;others<br>&nbsp;&nbsp;errorCode&nbsp;:=&nbsp;param2;<br>&nbsp;&nbsp;msg_back&nbsp;&nbsp;:=&nbsp;PDWORD(param2);<br><br><br>&nbsp;&nbsp;case&nbsp;msgId&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_PROCESS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;for&nbsp;each&nbsp;file,&nbsp;capturing&nbsp;to&nbsp;see&nbsp;if&nbsp;callee&nbsp;intends&nbsp;to<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//capture&nbsp;the&nbsp;file&nbsp;or&nbsp;not.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//If&nbsp;you&nbsp;do&nbsp;not&nbsp;intend&nbsp;to&nbsp;capture&nbsp;this&nbsp;file,&nbsp;then&nbsp;assign&nbsp;FALSE&nbsp;in&nbsp;msg_back<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//but&nbsp;still&nbsp;returns&nbsp;WIM_MSG_SUCCESS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Default&nbsp;is&nbsp;TRUE.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//In&nbsp;this&nbsp;sample,&nbsp;simply&nbsp;print&nbsp;out&nbsp;file&nbsp;name&nbsp;being&nbsp;applied<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('FilePath:&nbsp;%s',&nbsp;[filePath]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;	WIM_MSG_SETRANGE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_SETPOS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>		&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_PROGRESS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>		&nbsp;&nbsp;Form25.ProgressBar1.Position&nbsp;:=&nbsp;Percent;<br>		&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_ERROR:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;upon&nbsp;failure&nbsp;error&nbsp;case<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('ERROR:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_RETRY:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;when&nbsp;file&nbsp;is&nbsp;being&nbsp;reapplied&nbsp;because&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//network&nbsp;timeout.&nbsp;Retry&nbsp;is&nbsp;done&nbsp;up&nbsp;to&nbsp;five&nbsp;times.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('RETRY:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_INFO:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;when&nbsp;informational&nbsp;message&nbsp;is&nbsp;available<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('INFO:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_WARNING:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;when&nbsp;warning&nbsp;message&nbsp;is&nbsp;available<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('WARNING:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]/n',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_COMPRESS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;WIM_MSG_SUCCESS;<br>end;<br><br>procedure&nbsp;SampleCaptureCleanup(hwim:&nbsp;THandle;&nbsp;himg:&nbsp;THandle;&nbsp;callback:&nbsp;Pointer);<br>var<br>&nbsp;&nbsp;err&nbsp;:&nbsp;DWORD;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Do&nbsp;not&nbsp;overwrite&nbsp;the&nbsp;original&nbsp;error&nbsp;code<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(himg&nbsp;&lt;&gt;&nbsp;0)&nbsp;and&nbsp;not&nbsp;WIMCloseHandle&nbsp;(himg)&nbsp;and&nbsp;&nbsp;&nbsp;//&nbsp;close&nbsp;Image&nbsp;file&nbsp;first<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(err&nbsp;=&nbsp;ERROR_SUCCESS)&nbsp;then<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hwim&nbsp;&lt;&gt;&nbsp;0)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;WIMCloseHandle&nbsp;(hwim)&nbsp;and&nbsp;&nbsp;&nbsp;//&nbsp;close&nbsp;WIM&nbsp;file&nbsp;last<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(err&nbsp;=&nbsp;ERROR_SUCCESS)&nbsp;then<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(callback&nbsp;&lt;&gt;nil)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;WIMUnregisterMessageCallback(0,&nbsp;callback&nbsp;)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(err&nbsp;=&nbsp;ERROR_SUCCESS)&nbsp;then<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;SetLastError&nbsp;(err);<br>end;<br><br>procedure&nbsp;TForm25.Button1Click(Sender:&nbsp;TObject);<br>begin<br><br>end;<br><br>procedure&nbsp;TForm25.Button2Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;&nbsp;hWim&nbsp;:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;hImg&nbsp;:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;created&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFlag&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oAccess:&nbsp;DWORD;<br><br>&nbsp;&nbsp;&nbsp;callback&nbsp;:&nbsp;Pointer;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;wimFile&nbsp;&nbsp;&nbsp;:&nbsp;WideString;&nbsp;&nbsp;&nbsp;//&nbsp;target&nbsp;WIM&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;tmpDir&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WideString;&nbsp;//&nbsp;temporary&nbsp;directory:&nbsp;OPTIONAL<br>&nbsp;&nbsp;&nbsp;&nbsp;captureDir:&nbsp;WideString;&nbsp;&nbsp;&nbsp;//&nbsp;capture&nbsp;directory&nbsp;or&nbsp;drive<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;//generic&nbsp;capture/append&nbsp;call&nbsp;sequence<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;//w&nbsp;=&nbsp;WIMCreateFile()<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMSetTemporaryPath()&nbsp;-&nbsp;optional<br>&nbsp;&nbsp;&nbsp;&nbsp;//i&nbsp;=&nbsp;WIMCaptureImage()<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMCloseHandle(i)<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMCloseHandle(w)<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br><br>&nbsp;&nbsp;&nbsp;&nbsp;wimFile&nbsp;:=&nbsp;'C:/sample_image.wim';<br>&nbsp;&nbsp;&nbsp;&nbsp;captureDir:=&nbsp;'C:/Src';<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;callback&nbsp;:=&nbsp;@SampleCaptureCallback;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Set&nbsp;up&nbsp;access&nbsp;mode&nbsp;and&nbsp;open&nbsp;flag<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;oFlag&nbsp;&nbsp;&nbsp;:=&nbsp;WIM_CREATE_ALWAYS;<br>&nbsp;&nbsp;&nbsp;&nbsp;oAccess&nbsp;:=&nbsp;WIM_GENERIC_WRITE;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Register&nbsp;callback<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;WIMRegisterMessageCallback(0,callback,nil)=INVALID_CALLBACK_VALUE&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('Cannot&nbsp;set&nbsp;callback');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Call&nbsp;SampleCleanup()&nbsp;upon&nbsp;exit&nbsp;from&nbsp;here<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;hWim&nbsp;:=&nbsp;WIMCreateFile&nbsp;(&nbsp;PWideChar(wimFile),&nbsp;//&nbsp;existing&nbsp;WIM&nbsp;file&nbsp;to&nbsp;append&nbsp;to<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oAccess,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;access&nbsp;mode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFlag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;open&nbsp;flag<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;//&nbsp;WIM_FLAG_VERIFY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;recommended&nbsp;flag&nbsp;for&nbsp;file&nbsp;corruption&nbsp;check<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIM_COMPRESS_XPRESS,&nbsp;//&nbsp;or&nbsp;WIM_COMPRESS_LZX&nbsp;or&nbsp;WIM_COMPRESS_NONE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@created&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hWim&nbsp;=0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('Cannot&nbsp;open&nbsp;WIM&nbsp;file');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;temporary&nbsp;directory&nbsp;to&nbsp;work&nbsp;in<br>&nbsp;&nbsp;&nbsp;&nbsp;//OPTIONAL,&nbsp;but&nbsp;recommended&nbsp;for&nbsp;large&nbsp;WIM&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMSetTemporaryPath&nbsp;(hWim,&nbsp;tmpDir);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OK&nbsp;to&nbsp;fail.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Now&nbsp;capture&nbsp;or&nbsp;append&nbsp;image<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;hImg&nbsp;:=&nbsp;WIMCaptureImage&nbsp;(&nbsp;hWim,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PWideChar(captureDir),&nbsp;&nbsp;&nbsp;//&nbsp;capture&nbsp;directory&nbsp;or&nbsp;drive<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;WIM_FLAG_VERIFY<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Now&nbsp;we&nbsp;are&nbsp;done<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup&nbsp;(hWim,&nbsp;hImg,&nbsp;callback);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetLastError()&nbsp;&lt;&gt;&nbsp;ERROR_SUCCESS)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('Cannot&nbsp;capture&nbsp;image');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>end.<br><br><br>unit&nbsp;WImgAPI;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages;<br><br>const<br>&nbsp;&nbsp;WIM_GENERIC_READ&nbsp;&nbsp;=&nbsp;GENERIC_READ;<br>&nbsp;&nbsp;WIM_GENERIC_WRITE&nbsp;=&nbsp;GENERIC_WRITE;<br>&nbsp;&nbsp;WIM_CREATE_NEW&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;CREATE_NEW;<br>&nbsp;&nbsp;WIM_CREATE_ALWAYS&nbsp;=&nbsp;CREATE_ALWAYS;<br>&nbsp;&nbsp;WIM_OPEN_EXISTING&nbsp;=&nbsp;OPEN_EXISTING;<br>&nbsp;&nbsp;WIM_OPEN_ALWAYS&nbsp;&nbsp;&nbsp;=&nbsp;OPEN_ALWAYS;<br><br>const<br>&nbsp;&nbsp;WIM_COMPRESS_NONE&nbsp;&nbsp;&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;WIM_COMPRESS_XPRESS&nbsp;=&nbsp;1;<br>&nbsp;&nbsp;WIM_COMPRESS_LZX&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;2;<br><br>const<br>&nbsp;&nbsp;WIM_CREATED_NEW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;WIM_OPENED_EXISTING&nbsp;=&nbsp;1;<br><br><br>//&nbsp;WIMCreateFile,&nbsp;WIMCaptureImage,&nbsp;WIMApplyImage&nbsp;flags:<br>const<br>&nbsp;&nbsp;WIM_FLAG_RESERVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000001;<br>&nbsp;&nbsp;WIM_FLAG_VERIFY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000002;<br>&nbsp;&nbsp;WIM_FLAG_INDEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000004;<br>&nbsp;&nbsp;WIM_FLAG_NO_APPLY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000008;<br>&nbsp;&nbsp;WIM_FLAG_NO_DIRACL&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000010;<br>&nbsp;&nbsp;WIM_FLAG_NO_FILEACL&nbsp;&nbsp;&nbsp;=&nbsp;$00000020;<br>&nbsp;&nbsp;WIM_FLAG_SHARE_WRITE&nbsp;&nbsp;=&nbsp;$00000040;<br>&nbsp;&nbsp;WIM_FLAG_FILEINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000080;<br>&nbsp;&nbsp;WIM_FLAG_NO_RP_FIX&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000100;&nbsp;&nbsp;//&nbsp;do&nbsp;not&nbsp;fix&nbsp;up&nbsp;reparse&nbsp;point&nbsp;tag<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;only&nbsp;used&nbsp;in&nbsp;WIMCaptureImage<br><br>//&nbsp;WIMSetReferenceFile<br>const<br>&nbsp;&nbsp;WIM_REFERENCE_APPEND&nbsp;&nbsp;=&nbsp;$00010000;<br>&nbsp;&nbsp;WIM_REFERENCE_REPLACE&nbsp;=&nbsp;$00020000;<br><br>//&nbsp;WIMExportImage<br>const<br>&nbsp;&nbsp;WIM_EXPORT_ALLOW_DUPLICATES&nbsp;=&nbsp;$00000001;<br>&nbsp;&nbsp;WIM_EXPORT_ONLY_RESOURCES&nbsp;&nbsp;&nbsp;=&nbsp;$00000002;<br>&nbsp;&nbsp;WIM_EXPORT_ONLY_METADATA&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000004;<br><br>//&nbsp;WIMRegisterMessageCallback:<br>const<br>&nbsp;&nbsp;INVALID_CALLBACK_VALUE&nbsp;&nbsp;=&nbsp;$FFFFFFFF;<br><br>//&nbsp;WIMCopyFile<br>const<br>&nbsp;&nbsp;WIM_COPY_FILE_RETRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$01000000;<br><br>//&nbsp;WIMMessageCallback&nbsp;Notifications:<br>const<br>&nbsp;&nbsp;WIM_MSG&nbsp;=&nbsp;WM_APP&nbsp;+&nbsp;$1476;<br>&nbsp;&nbsp;WIM_MSG_TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;WIM_MSG_PROGRESS&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;2;<br>&nbsp;&nbsp;WIM_MSG_PROCESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;3;<br>&nbsp;&nbsp;WIM_MSG_SCANNING&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;4;<br>&nbsp;&nbsp;WIM_MSG_SETRANGE&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;5;<br>&nbsp;&nbsp;WIM_MSG_SETPOS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;6;<br>&nbsp;&nbsp;WIM_MSG_STEPIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;7;<br>&nbsp;&nbsp;WIM_MSG_COMPRESS&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;8;<br>&nbsp;&nbsp;WIM_MSG_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;9;<br>&nbsp;&nbsp;WIM_MSG_ALIGNMENT&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;10;<br>&nbsp;&nbsp;WIM_MSG_RETRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;11;<br>&nbsp;&nbsp;WIM_MSG_SPLIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;12;<br>&nbsp;&nbsp;WIM_MSG_FILEINFO&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;13;<br>&nbsp;&nbsp;WIM_MSG_INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;14;<br>&nbsp;&nbsp;WIM_MSG_WARNING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;15;<br>&nbsp;&nbsp;WIM_MSG_CHK_PROCESS&nbsp;=&nbsp;WIM_MSG&nbsp;+&nbsp;16;<br><br><br>//&nbsp;WIMMessageCallback&nbsp;Return&nbsp;codes:<br>const<br>&nbsp;&nbsp;WIM_MSG_SUCCESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ERROR_SUCCESS;<br>&nbsp;&nbsp;WIM_MSG_DONE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$FFFFFFF0;<br>&nbsp;&nbsp;WIM_MSG_SKIP_ERROR&nbsp;&nbsp;=&nbsp;$FFFFFFFE;<br>&nbsp;&nbsp;WIM_MSG_ABORT_IMAGE&nbsp;=&nbsp;$FFFFFFFF;<br><br><br>//&nbsp;WIM_INFO&nbsp;dwFlags&nbsp;values:<br>const<br>&nbsp;&nbsp;WIM_ATTRIBUTE_NORMAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000000;<br>&nbsp;&nbsp;WIM_ATTRIBUTE_RESOURCE_ONLY&nbsp;=&nbsp;$00000001;<br>&nbsp;&nbsp;WIM_ATTRIBUTE_METADATA_ONLY&nbsp;=&nbsp;$00000002;<br>&nbsp;&nbsp;WIM_ATTRIBUTE_VERIFY_DATA&nbsp;&nbsp;&nbsp;=&nbsp;$00000004;<br>&nbsp;&nbsp;WIM_ATTRIBUTE_RP_FIX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000008;<br>&nbsp;&nbsp;WIM_ATTRIBUTE_SPANNED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000010;<br>&nbsp;&nbsp;WIM_ATTRIBUTE_READONLY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;$00000020;<br><br>type<br>&nbsp;&nbsp;_WIM_INFO&nbsp;&nbsp;&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;WimPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;array[0..MAX_PATH&nbsp;-&nbsp;1]&nbsp;of&nbsp;WideChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;Guid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;TGUID;<br>&nbsp;&nbsp;&nbsp;&nbsp;ImageCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;CompressionType&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;PartNumber&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;TotalParts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;BootIndex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;WimAttributes&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;WimFlagsAndAttr&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;WIM_INFO&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;_WIM_INFO;<br>&nbsp;&nbsp;LPWIM_INFO&nbsp;&nbsp;=&nbsp;^WIM_INFO;<br>&nbsp;&nbsp;PWIM_INFO&nbsp;&nbsp;&nbsp;=&nbsp;^WIM_INFO;<br><br>type<br>&nbsp;&nbsp;_WIM_MOUNT_LIST&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;WimPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;array[0..MAX_PATH&nbsp;-&nbsp;1]&nbsp;of&nbsp;WideChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;MountPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;array[0..MAX_PATH&nbsp;-&nbsp;1]&nbsp;of&nbsp;WideChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;ImageIndex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;MountedForRW&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;BOOL;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;WIM_MOUNT_LIST&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;_WIM_MOUNT_LIST;<br>&nbsp;&nbsp;LPWIM_MOUNT_LIST&nbsp;&nbsp;=&nbsp;^WIM_MOUNT_LIST;<br>&nbsp;&nbsp;PWIM_MOUNT_LIST&nbsp;&nbsp;&nbsp;=&nbsp;^WIM_MOUNT_LIST;<br><br>type<br>&nbsp;&nbsp;PLARGE_INTEGER&nbsp;=&nbsp;^LARGE_INTEGER;<br><br>function&nbsp;WIMApplyImage(<br>&nbsp;&nbsp;hImage:&nbsp;THandle;<br>&nbsp;&nbsp;pzPath:&nbsp;PWideChar;<br>&nbsp;&nbsp;dwApplyFlags:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;<br><br>function&nbsp;WIMCaptureImage(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;lpszCapturePath:&nbsp;PWideChar;<br>&nbsp;&nbsp;dwCaptureFlags:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;THandle;&nbsp;stdcall;<br><br>function&nbsp;WIMCloseHandle(<br>&nbsp;&nbsp;hObject:&nbsp;THandle<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMCopyFile(<br>&nbsp;&nbsp;pszExistingFileName,<br>&nbsp;&nbsp;pszNewFileName:&nbsp;PWideChar;<br>&nbsp;&nbsp;pProgressRoutine,<br>&nbsp;&nbsp;pvData,<br>&nbsp;&nbsp;pbCancel:&nbsp;Pointer;<br>&nbsp;&nbsp;dwCopyFlags:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMCreateFile(<br>&nbsp;&nbsp;pzWimPath:&nbsp;PWideChar;<br>&nbsp;&nbsp;dwDesiredAccess,<br>&nbsp;&nbsp;dwCreationDisposition,<br>&nbsp;&nbsp;dwFlagsAndAttributes,<br>&nbsp;&nbsp;dwCompressionType:&nbsp;DWORD;<br>&nbsp;&nbsp;pdwCreationResult:&nbsp;PDWORD<br>&nbsp;&nbsp;):&nbsp;THandle;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMDeleteImage(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;dwImageIndex:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMExportImage(<br>&nbsp;&nbsp;shImage,<br>&nbsp;&nbsp;thWim:&nbsp;THandle;<br>&nbsp;&nbsp;dwFlags:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMGetAttributes(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;lpcbImageInfo:&nbsp;PWIM_INFO;<br>&nbsp;&nbsp;cbWimInfo:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMGetImageCount(<br>&nbsp;&nbsp;hWim:&nbsp;THandle<br>&nbsp;&nbsp;):&nbsp;DWORD;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMGetImageInformation(<br>&nbsp;&nbsp;hImage:&nbsp;THandle;<br>&nbsp;&nbsp;pvImageInfo:&nbsp;Pointer;<br>&nbsp;&nbsp;lpcbImageInfo:&nbsp;PDWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMGetMessageCallbackCount(<br>&nbsp;&nbsp;hWim:&nbsp;THandle<br>&nbsp;&nbsp;):&nbsp;DWORD;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMGetMountedImages(<br>&nbsp;&nbsp;pMountList:&nbsp;PWIM_MOUNT_LIST;<br>&nbsp;&nbsp;pcbBufferSize:&nbsp;PDWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMLoadImage(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;dwImageIndex:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;THandle;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMMountImage(<br>&nbsp;&nbsp;lpszMountPath,<br>&nbsp;&nbsp;lpszWimFileName:&nbsp;PWideChar;<br>&nbsp;&nbsp;dwImageIndex:&nbsp;DWORD;<br>&nbsp;&nbsp;lpszTempPath:&nbsp;PWideChar<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMRegisterMessageCallback(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;fpMessageProc,<br>&nbsp;&nbsp;pvUserData:&nbsp;Pointer<br>&nbsp;&nbsp;):&nbsp;DWORD;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMSetBootImage(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;dwImageIndex:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMSetImageInformation(<br>&nbsp;&nbsp;hImage:&nbsp;THandle;<br>&nbsp;&nbsp;pvImageInfo:&nbsp;Pointer;<br>&nbsp;&nbsp;cbImageInfo:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMSetReferenceFile(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;pzPath:&nbsp;PWideChar;<br>&nbsp;&nbsp;dwFlags:&nbsp;DWORD<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMSetTemporaryPath(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;pzPath:&nbsp;PWideChar<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMSplitFile(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;lpszPartPath:&nbsp;PWideChar;<br>&nbsp;&nbsp;pliPartSize:&nbsp;PLARGE_INTEGER;<br>&nbsp;&nbsp;dwFlags:&nbsp;DWORD):&nbsp;BOOL;&nbsp;stdcall;&nbsp;<br><br>function&nbsp;WIMUnmountImage(<br>&nbsp;&nbsp;lpszMountPath,<br>&nbsp;&nbsp;lpszWimFileName:&nbsp;PWideChar;<br>&nbsp;&nbsp;dwImageIndex:&nbsp;DWORD;<br>&nbsp;&nbsp;bCommitChanges:&nbsp;BOOL<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;<br><br>function&nbsp;WIMUnregisterMessageCallback(<br>&nbsp;&nbsp;hWim:&nbsp;THandle;<br>&nbsp;&nbsp;fpMessageProc:&nbsp;Pointer<br>&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;<br><br><br>function&nbsp;WIMInitFileIOCallbacks(<br>&nbsp;&nbsp;&nbsp;&nbsp;lpCallbacks:&nbsp;Pointer<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;<br><br>function&nbsp;WIMSetFileIOCallbackTemporaryPath(<br>&nbsp;&nbsp;&nbsp;&nbsp;lpszPath:&nbsp;PChar<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;BOOL;&nbsp;stdcall;<br><br>//<br>//&nbsp;File&nbsp;I/O&nbsp;callback&nbsp;prototypes<br>//<br>type<br>&nbsp;&nbsp;PFILEIOCALLBACK_SESSION&nbsp;=&nbsp;Pointer;<br><br>type<br>&nbsp;&nbsp;FileIOCallbackOpenFile&nbsp;=&nbsp;function(<br>&nbsp;&nbsp;&nbsp;&nbsp;lpFileName:&nbsp;PWideChar<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;PFILEIOCALLBACK_SESSION;<br><br><br>&nbsp;&nbsp;FileIOCallbackCloseFile&nbsp;=&nbsp;function(<br>&nbsp;&nbsp;&nbsp;&nbsp;hFile:&nbsp;PFILEIOCALLBACK_SESSION<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;BOOL;<br><br>&nbsp;&nbsp;FileIOCallbackReadFile&nbsp;=&nbsp;function(<br>&nbsp;&nbsp;&nbsp;&nbsp;hFile:&nbsp;PFILEIOCALLBACK_SESSION;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpBuffer:&nbsp;Pointer;<br>&nbsp;&nbsp;&nbsp;&nbsp;nNumberOfBytesToRead:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpNumberOfBytesRead:&nbsp;LPDWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpOverlapped:&nbsp;POVERLAPPED<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;BOOL;<br><br>&nbsp;&nbsp;FileIOCallbackSetFilePointer&nbsp;=&nbsp;function(<br>&nbsp;&nbsp;&nbsp;&nbsp;hFile:&nbsp;PFILEIOCALLBACK_SESSION;<br>&nbsp;&nbsp;&nbsp;&nbsp;liDistanceToMove:&nbsp;LARGE_INTEGER;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpNewFilePointer:&nbsp;PLARGE_INTEGER;<br>&nbsp;&nbsp;&nbsp;&nbsp;dwMoveMethod:&nbsp;DWORD<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;BOOL;<br><br>&nbsp;&nbsp;FileIOCallbackGetFileSize&nbsp;=&nbsp;function(<br>&nbsp;&nbsp;&nbsp;&nbsp;hFile&nbsp;:&nbsp;THANDLE;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpFileSize:&nbsp;PLARGE_INTEGER<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;BOOL;<br><br>type<br>&nbsp;&nbsp;_SFileIOCallbackInfo&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;pfnOpenFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;FileIOCallbackOpenFile;<br>&nbsp;&nbsp;&nbsp;&nbsp;pfnCloseFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;FileIOCallbackCloseFile;<br>&nbsp;&nbsp;&nbsp;&nbsp;pfnReadFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;FileIOCallbackReadFile;<br>&nbsp;&nbsp;&nbsp;&nbsp;pfnSetFilePointer:&nbsp;FileIOCallbackSetFilePointer;<br>&nbsp;&nbsp;&nbsp;&nbsp;pfnGetFileSize&nbsp;&nbsp;&nbsp;:&nbsp;FileIOCallbackGetFileSize;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;SFileIOCallbackInfo&nbsp;=&nbsp;_SFileIOCallbackInfo;<br><br>implementation<br><br>const<br>&nbsp;&nbsp;WIMGAPIModuleName&nbsp;=&nbsp;'WIMGAPI.DLL';<br><br>function&nbsp;WIMApplyImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMCaptureImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMCloseHandle;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMCopyFile;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMCreateFile;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMDeleteImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMExportImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMGetAttributes;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMGetImageCount;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMGetImageInformation;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMGetMessageCallbackCount;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMGetMountedImages;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMLoadImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMMountImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMRegisterMessageCallback;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMSetBootImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMSetImageInformation;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMSetReferenceFile;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMSetTemporaryPath;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMSplitFile;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMUnmountImage;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMUnregisterMessageCallback;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMInitFileIOCallbacks;&nbsp;external&nbsp;WIMGAPIModuleName;<br>function&nbsp;WIMSetFileIOCallbackTemporaryPath;&nbsp;external&nbsp;WIMGAPIModuleName;<br><br>end.
 
我正在研究,如何区分出制作前扫描的文件数和制作的文件数呢?<br>还有其他的(提取导出、应用解开)两模块怎么显示?特别是应用解开WIMApplyImage这个模块怎么显示?
 
其他的进度显示也都是这样的:<br>1、WIMRegisterMessageCallback<br>2、调用其他WIM函数<br>3、WIMUnregisterMessageCallback
 
tseug:你好<br>&nbsp;&nbsp;&nbsp;&nbsp;你使一下第三步:<br>3、在应用解开这个模块运行显示出进度条时,如何同时显示当前用了多少时间、余下多少时间及当前已应用解开的文件数。<br>不仅不出现该显示的内容,而且会出现死机现象
 
这个原因不清楚,最近也没有时间研究,在你给我的VC代码里采用了一个替代方法,<br>可以借鉴:<br>//Apply&nbsp;spawns&nbsp;a&nbsp;separate&nbsp;thread&nbsp;and&nbsp;Progress&nbsp;control&nbsp;doesn't&nbsp;work&nbsp;here<br>//Show&nbsp;modeless&nbsp;dialog&nbsp;instead<br>HWND&nbsp;hwndApply&nbsp;=&nbsp;CreateDialog(g_hinst,&nbsp;MAKEINTRESOURCE(DLG_APPLY),&nbsp;hwnd,&nbsp;NULL);<br>if&nbsp;(!WIMApplyImage(hImg,&nbsp;applyDir,&nbsp;0/*WIM_FLAG_VERIFY*/))<br> MessageBox(NULL,&nbsp;TEXT(&quot;Applying&nbsp;image&nbsp;failed&quot;),&nbsp;TEXT(&quot;Error&quot;),&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONEXCLAMATION);<br> <br>//Now&nbsp;we&nbsp;are&nbsp;done<br>DestroyWindow(hwndApply);&nbsp;<br><br>对于其他的函数如何计算时间,我提供一个思路,你能够知道当前已经使用时间,<br>而且知道当前进度,那么剩余时间就可以计算了。
 
tseug:你好<br>&nbsp;&nbsp;&nbsp;&nbsp;计算时间没问题,&nbsp;单独只有进度条显示我能够做出来,但是同时加上其他显示就死机。只要WIMApplyImage函数在应用解开的过程中在显示进度条工作状况时,能同时显示出解开的文件数及已用时间和剩余时间就行,你最近没时间研究,那就等你有空再研究吧,相信你能够解决的。
 
tseug:你好<br>&nbsp;&nbsp;&nbsp;&nbsp;WIMExportImage()也显示不出提取导出的文件数,而Ginagex.exe是可以除显示进度条外还可以显示出当前提取导出的文件数。而我只做出进度条显示(这个我原来就会的),我需要的是显示出文件数。
 
刚才简单跟踪了一下Applay,发现原因很简单,因为他另外启动了一个线程,但是<br>回调函数依然是被调用的,你可以用OutputDebugString看看那些消息的内容。<br>对于&nbsp;Export&nbsp;来说,根据WIM_MSG_SETRANGE你能够得到文件总数,WIM_MSG_STEPIT<br>消息每处理一个文件调用一次,你可以计算当前已处理的文件数。<br>另外,我看了一下你给我的帮助文件,发现WIM_MSG_PROGRESS&nbsp;里有跟时间有关的<br>内容,不过没试验,你自己研究吧。<br>最近很忙,代码我就不写了,祝你好运。
 
tseug:你好<br>&nbsp;&nbsp;&nbsp;&nbsp;你说:“对于&nbsp;Export&nbsp;来说,根据WIM_MSG_SETRANGE你能够得到文件总数”&nbsp;怎样才能得到这个总数?是那一个的值?&nbsp;WIM_MSG_STEPIT和WIM_MSG_PROCESS都可以得到计数值,应该WIM_MSG_PROCESS更准确一点,这一点我现在已可以得到计数值了。而对于Applay确实比较头痛,除一个进度条能显示外,其他显示控件只要一显示就死机.我相信你有办法、有能力解决的,希望你有空能帮助我解决一下。
 
其实解决办法很简单,你只要把调用Apply的那部分放到一个线程里执行就可以了。<br>我刚才试验了一下,一切正常。
 
tseug:你好<br>&nbsp;&nbsp;&nbsp;&nbsp;怎样“把调用Apply的那部分放到一个线程里执行”我不懂,可以写一下吗?<br>&nbsp;&nbsp;&nbsp;&nbsp;再一个,你说:“对于&nbsp;Export&nbsp;来说,根据WIM_MSG_SETRANGE你能够得到文件总数”&nbsp;怎样才能得到这个总数?
 
下面是我做试验用的代码,别见笑,如果谁受到启发写出来一个漂亮的Delphi<br>版GImageEx也就达到目的了。<br><br>
代码:
unit&nbsp;Unit25;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs,&nbsp;StdCtrls,&nbsp;ComCtrls;<br><br>type<br>&nbsp;&nbsp;TForm25&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;&nbsp;&nbsp;Memo1:&nbsp;TMemo;<br>&nbsp;&nbsp;&nbsp;&nbsp;Button1:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;Button2:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;ProgressBar1:&nbsp;TProgressBar;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Button1Click(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Button2Click(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Private&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;protected<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Public&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;Form25:&nbsp;TForm25;<br><br>implementation<br><br>{$R&nbsp;*.dfm}<br><br>uses<br>&nbsp;&nbsp;WImgApi;<br><br>//Callback&nbsp;function:<br>//<br>var<br>&nbsp;&nbsp;n&nbsp;:&nbsp;Integer;<br>function&nbsp;SampleCaptureCallback(<br>&nbsp;&nbsp;&nbsp;&nbsp;msgId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;message&nbsp;ID<br>&nbsp;&nbsp;&nbsp;&nbsp;param1&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WParam;&nbsp;&nbsp;&nbsp;//&nbsp;usually&nbsp;file&nbsp;name<br>&nbsp;&nbsp;&nbsp;&nbsp;param2&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;LParam;&nbsp;&nbsp;&nbsp;//&nbsp;usually&nbsp;error&nbsp;code<br>&nbsp;&nbsp;&nbsp;&nbsp;UserData&nbsp;&nbsp;:&nbsp;Pointer<br>&nbsp;&nbsp;&nbsp;&nbsp;):&nbsp;DWORD;&nbsp;stdcall;<br>var<br>&nbsp;&nbsp;Msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;PWideChar;<br>&nbsp;&nbsp;FilePath&nbsp;&nbsp;:&nbsp;PWideChar;<br>&nbsp;&nbsp;Percent&nbsp;&nbsp;&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;ErrorCode&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;Msg_Back&nbsp;&nbsp;:&nbsp;PDWORD;<br>&nbsp;&nbsp;finddata&nbsp;&nbsp;:&nbsp;WIN32_FIND_DATA;<br>&nbsp;&nbsp;filecount&nbsp;:&nbsp;DWORD;<br>begin<br>&nbsp;&nbsp;//first&nbsp;parameter:&nbsp;full&nbsp;file&nbsp;path&nbsp;for&nbsp;if&nbsp;WIM_MSG_PROCESS,&nbsp;message&nbsp;string&nbsp;for&nbsp;others<br>&nbsp;&nbsp;Msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;PWideChar(param1);<br>&nbsp;&nbsp;filePath&nbsp;:=&nbsp;PWideChar(param1);<br>&nbsp;&nbsp;percent&nbsp;&nbsp;:=&nbsp;param1;<br><br>&nbsp;&nbsp;//second&nbsp;parameter:&nbsp;message&nbsp;back&nbsp;to&nbsp;caller&nbsp;if&nbsp;WIM_MSG_PROCESS,&nbsp;error&nbsp;code&nbsp;for&nbsp;others<br>&nbsp;&nbsp;errorCode&nbsp;:=&nbsp;param2;<br>&nbsp;&nbsp;filecount&nbsp;:=&nbsp;param2;<br>&nbsp;&nbsp;msg_back&nbsp;&nbsp;:=&nbsp;PDWORD(param2);<br><br>&nbsp;&nbsp;OutputDebugString(PChar(Format('Msgid=%d,&nbsp;wParam=%d,&nbsp;lParam=%d',<br>&nbsp;&nbsp;&nbsp;&nbsp;[msgid-WIM_MSG,&nbsp;param1,&nbsp;param2])));<br>&nbsp;&nbsp;PostMessage(Form25.Handle,&nbsp;msgid,&nbsp;param1,&nbsp;param2);<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;WIM_MSG_SUCCESS;<br>//&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;case&nbsp;msgId&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_PROCESS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;for&nbsp;each&nbsp;file,&nbsp;capturing&nbsp;to&nbsp;see&nbsp;if&nbsp;callee&nbsp;intends&nbsp;to<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//capture&nbsp;the&nbsp;file&nbsp;or&nbsp;not.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//If&nbsp;you&nbsp;do&nbsp;not&nbsp;intend&nbsp;to&nbsp;capture&nbsp;this&nbsp;file,&nbsp;then&nbsp;assign&nbsp;FALSE&nbsp;in&nbsp;msg_back<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//but&nbsp;still&nbsp;returns&nbsp;WIM_MSG_SUCCESS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Default&nbsp;is&nbsp;TRUE.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//In&nbsp;this&nbsp;sample,&nbsp;simply&nbsp;print&nbsp;out&nbsp;file&nbsp;name&nbsp;being&nbsp;applied<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('FilePath:&nbsp;%s',&nbsp;[filePath]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;	WIM_MSG_SETRANGE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('FileCount:&nbsp;%d',&nbsp;[filecount]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_SETPOS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('CurrentFiles:&nbsp;%d',&nbsp;[filecount]));<br>		&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_PROGRESS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>		&nbsp;&nbsp;Form25.ProgressBar1.Position&nbsp;:=&nbsp;Percent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('estimated&nbsp;time:&nbsp;%d',&nbsp;[filecount&nbsp;div&nbsp;1000]));<br>		&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_STEPIT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('n=%d',[n]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inc(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_FILEINFO:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('FilePath:&nbsp;%s',&nbsp;[filePath]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_ERROR:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;upon&nbsp;failure&nbsp;error&nbsp;case<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('ERROR:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_RETRY:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;when&nbsp;file&nbsp;is&nbsp;being&nbsp;reapplied&nbsp;because&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//network&nbsp;timeout.&nbsp;Retry&nbsp;is&nbsp;done&nbsp;up&nbsp;to&nbsp;five&nbsp;times.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('RETRY:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_INFO:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;when&nbsp;informational&nbsp;message&nbsp;is&nbsp;available<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('INFO:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_WARNING:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;message&nbsp;is&nbsp;sent&nbsp;when&nbsp;warning&nbsp;message&nbsp;is&nbsp;available<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('WARNING:&nbsp;%s&nbsp;[err&nbsp;=&nbsp;%d]/n',&nbsp;[msg,&nbsp;errorCode]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_COMPRESS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('WIM_MSG_COMPRESS',[]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_CHK_PROCESS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('WIM_MSG_CHK_PROCESS',[]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_SCANNING:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('dirs:&nbsp;%d&nbsp;files:&nbsp;%d',[param1,&nbsp;param2]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;WIM_MSG_ALIGNMENT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('FilePath:&nbsp;%s',&nbsp;[filePath]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('UnknowMsg&nbsp;%0.4X&nbsp;%d&nbsp;%d',&nbsp;[msgid,&nbsp;param1,&nbsp;param2]));<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>end;<br><br>procedure&nbsp;SampleCaptureCleanup(hwim:&nbsp;THandle;&nbsp;himg:&nbsp;THandle;&nbsp;callback:&nbsp;Pointer);<br>var<br>&nbsp;&nbsp;err&nbsp;:&nbsp;DWORD;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Do&nbsp;not&nbsp;overwrite&nbsp;the&nbsp;original&nbsp;error&nbsp;code<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(himg&nbsp;&lt;&gt;&nbsp;0)&nbsp;and&nbsp;not&nbsp;WIMCloseHandle&nbsp;(himg)&nbsp;and&nbsp;&nbsp;&nbsp;//&nbsp;close&nbsp;Image&nbsp;file&nbsp;first<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(err&nbsp;=&nbsp;ERROR_SUCCESS)&nbsp;then<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hwim&nbsp;&lt;&gt;&nbsp;0)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;WIMCloseHandle&nbsp;(hwim)&nbsp;and&nbsp;&nbsp;&nbsp;//&nbsp;close&nbsp;WIM&nbsp;file&nbsp;last<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(err&nbsp;=&nbsp;ERROR_SUCCESS)&nbsp;then<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(callback&nbsp;&lt;&gt;nil)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;WIMUnregisterMessageCallback(0,&nbsp;callback&nbsp;)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(err&nbsp;=&nbsp;ERROR_SUCCESS)&nbsp;then<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:=&nbsp;GetLastError();<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;SetLastError&nbsp;(err);<br>end;<br><br>type<br>&nbsp;&nbsp;TApplyThread&nbsp;=&nbsp;class(TThread)<br><br>&nbsp;&nbsp;protected<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Execute;&nbsp;override;<br>&nbsp;&nbsp;end;<br><br>procedure&nbsp;TApplyThread.Execute;<br>var<br>&nbsp;&nbsp;&nbsp;hWim&nbsp;:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;hImg&nbsp;:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;created&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFlag&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oAccess:&nbsp;DWORD;<br><br>&nbsp;&nbsp;&nbsp;callback&nbsp;:&nbsp;Pointer;<br>hWimInfo:&nbsp;WIM_INFO;<br>imgIndex:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;wimFile&nbsp;&nbsp;&nbsp;:&nbsp;WideString;&nbsp;&nbsp;&nbsp;//&nbsp;target&nbsp;WIM&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;tmpDir&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WideString;&nbsp;//&nbsp;temporary&nbsp;directory:&nbsp;OPTIONAL<br>&nbsp;&nbsp;&nbsp;&nbsp;ApplayDir:&nbsp;WideString;&nbsp;&nbsp;&nbsp;//&nbsp;capture&nbsp;directory&nbsp;or&nbsp;drive<br><br>begin<br>&nbsp;&nbsp;FreeOnTerminate&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;wimFile&nbsp;:=&nbsp;'C:/sample_image.wim';<br>&nbsp;&nbsp;&nbsp;&nbsp;tmpDir&nbsp;&nbsp;:=&nbsp;'C:/Temp';<br>&nbsp;&nbsp;&nbsp;&nbsp;ApplayDir:=&nbsp;'C:/Src';<br><br>&nbsp;&nbsp;&nbsp;&nbsp;callback&nbsp;:=&nbsp;@SampleCaptureCallback;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;//Set&nbsp;up&nbsp;access&nbsp;mode&nbsp;and&nbsp;open&nbsp;flag<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;oFlag&nbsp;&nbsp;&nbsp;:=&nbsp;WIM_GENERIC_READ;<br>&nbsp;&nbsp;&nbsp;&nbsp;oAccess&nbsp;:=&nbsp;WIM_OPEN_EXISTING;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Register&nbsp;callback<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;WIMRegisterMessageCallback(0,callback,nil)=INVALID_CALLBACK_VALUE&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add('Cannot&nbsp;set&nbsp;callback');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Call&nbsp;SampleCleanup()&nbsp;upon&nbsp;exit&nbsp;from&nbsp;here<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;hWim&nbsp;:=&nbsp;WIMCreateFile&nbsp;(&nbsp;PWideChar(wimFile),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;existing&nbsp;WIM&nbsp;file&nbsp;to&nbsp;append&nbsp;to<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIM_GENERIC_READ,&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;access&nbsp;mode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIM_OPEN_EXISTING,&nbsp;&nbsp;&nbsp;//&nbsp;open&nbsp;flag<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIM_FLAG_VERIFY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;recommended&nbsp;flag&nbsp;for&nbsp;file&nbsp;corruption&nbsp;check<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@created&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hWim&nbsp;=0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add('Cannot&nbsp;open&nbsp;WIM&nbsp;file');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;temporary&nbsp;directory&nbsp;to&nbsp;work&nbsp;in<br>&nbsp;&nbsp;&nbsp;&nbsp;//OPTIONAL,&nbsp;but&nbsp;recommended&nbsp;for&nbsp;large&nbsp;WIM&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMSetTemporaryPath&nbsp;(hWim,&nbsp;tmpDir);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OK&nbsp;to&nbsp;fail.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Now&nbsp;capture&nbsp;or&nbsp;append&nbsp;image<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(not&nbsp;WIMGetAttributes(&nbsp;hWim,&nbsp;@hWimInfo,&nbsp;sizeof(hWimInfo)))&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add('WIMGetAttributes&nbsp;failed');<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SampleApplyCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;imgIndex&nbsp;:=&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hWimInfo.ImageCount&nbsp;&lt;&nbsp;imgIndex)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('There&nbsp;is&nbsp;no&nbsp;index&nbsp;%d&nbsp;in&nbsp;the&nbsp;WIM&nbsp;file',&nbsp;[imgIndex]));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleApplyCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;temporary&nbsp;directory&nbsp;to&nbsp;work&nbsp;in<br>&nbsp;&nbsp;&nbsp;&nbsp;//REQUIRED&nbsp;for&nbsp;apply<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(not&nbsp;WIMSetTemporaryPath&nbsp;(hWim,&nbsp;PWideChar(tmpDir)))&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add('cannot&nbsp;set&nbsp;temp&nbsp;path&nbsp;to&nbsp;work&nbsp;in');<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleApplyCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Now&nbsp;apply&nbsp;the&nbsp;image<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;hImg&nbsp;:=&nbsp;WIMLoadImage&nbsp;(&nbsp;hWim,&nbsp;imgIndex&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;hImg&nbsp;&nbsp;=&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add(Format('Cannot&nbsp;load&nbsp;imagex&nbsp;%d&nbsp;from&nbsp;src&nbsp;WIM&nbsp;file',&nbsp;[imgIndex]));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleApplyCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;:=&nbsp;0;<br>//&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(not&nbsp;WIMExportImage&nbsp;(&nbsp;hImg,<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hWim,&nbsp;&nbsp;&nbsp;//&nbsp;apply&nbsp;directory&nbsp;or&nbsp;drive<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIM_EXPORT_ALLOW_DUPLICATES&nbsp;))<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(not&nbsp;WIMApplyImage&nbsp;(&nbsp;hImg,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PWideChar(ApplayDir),&nbsp;&nbsp;&nbsp;//&nbsp;apply&nbsp;directory&nbsp;or&nbsp;drive<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIM_FLAG_FILEINFO&nbsp;or&nbsp;WIM_FLAG_VERIFY))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add('Applying&nbsp;image&nbsp;failed');<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Now&nbsp;we&nbsp;are&nbsp;done<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup&nbsp;(hWim,&nbsp;hImg,&nbsp;callback);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetLastError()&nbsp;&lt;&gt;&nbsp;ERROR_SUCCESS)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form25.Memo1.Lines.Add('Cannot&nbsp;Applay&nbsp;image');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;TForm25.Button1Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;t&nbsp;:&nbsp;TApplyThread;<br>begin<br>&nbsp;&nbsp;t&nbsp;:=&nbsp;TApplyThread.Create(False);<br>end;<br><br>procedure&nbsp;TForm25.Button2Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;&nbsp;hWim&nbsp;:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;hImg&nbsp;:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;created&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;oFlag&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;oAccess:&nbsp;DWORD;<br><br>&nbsp;&nbsp;&nbsp;callback&nbsp;:&nbsp;Pointer;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;wimFile&nbsp;&nbsp;&nbsp;:&nbsp;WideString;&nbsp;&nbsp;&nbsp;//&nbsp;target&nbsp;WIM&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;captureDir:&nbsp;WideString;&nbsp;&nbsp;&nbsp;//&nbsp;capture&nbsp;directory&nbsp;or&nbsp;drive<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;//generic&nbsp;capture/append&nbsp;call&nbsp;sequence<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;//w&nbsp;=&nbsp;WIMCreateFile()<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMSetTemporaryPath()&nbsp;-&nbsp;optional<br>&nbsp;&nbsp;&nbsp;&nbsp;//i&nbsp;=&nbsp;WIMCaptureImage()<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMCloseHandle(i)<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMCloseHandle(w)<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br><br>&nbsp;&nbsp;&nbsp;&nbsp;wimFile&nbsp;:=&nbsp;'C:/sample_image.wim';<br>&nbsp;&nbsp;&nbsp;&nbsp;captureDir:=&nbsp;'C:/Src';<br><br>&nbsp;&nbsp;&nbsp;&nbsp;callback&nbsp;:=&nbsp;@SampleCaptureCallback;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Set&nbsp;up&nbsp;access&nbsp;mode&nbsp;and&nbsp;open&nbsp;flag<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;oFlag&nbsp;&nbsp;&nbsp;:=&nbsp;WIM_CREATE_ALWAYS;<br>&nbsp;&nbsp;&nbsp;&nbsp;oAccess&nbsp;:=&nbsp;WIM_GENERIC_WRITE;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Register&nbsp;callback<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;WIMRegisterMessageCallback(0,callback,nil)=INVALID_CALLBACK_VALUE&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('Cannot&nbsp;set&nbsp;callback');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Call&nbsp;SampleCleanup()&nbsp;upon&nbsp;exit&nbsp;from&nbsp;here<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;hWim&nbsp;:=&nbsp;WIMCreateFile&nbsp;(&nbsp;PWideChar(wimFile),&nbsp;//&nbsp;existing&nbsp;WIM&nbsp;file&nbsp;to&nbsp;append&nbsp;to<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oAccess,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;access&nbsp;mode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFlag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;open&nbsp;flag<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;//&nbsp;WIM_FLAG_VERIFY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;recommended&nbsp;flag&nbsp;for&nbsp;file&nbsp;corruption&nbsp;check<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIM_COMPRESS_XPRESS,&nbsp;//&nbsp;or&nbsp;WIM_COMPRESS_LZX&nbsp;or&nbsp;WIM_COMPRESS_NONE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@created&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hWim&nbsp;=0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('Cannot&nbsp;open&nbsp;WIM&nbsp;file');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup(hWim,&nbsp;hImg,&nbsp;callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;temporary&nbsp;directory&nbsp;to&nbsp;work&nbsp;in<br>&nbsp;&nbsp;&nbsp;&nbsp;//OPTIONAL,&nbsp;but&nbsp;recommended&nbsp;for&nbsp;large&nbsp;WIM&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;//WIMSetTemporaryPath&nbsp;(hWim,&nbsp;tmpDir);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OK&nbsp;to&nbsp;fail.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Now&nbsp;capture&nbsp;or&nbsp;append&nbsp;image<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;hImg&nbsp;:=&nbsp;WIMCaptureImage&nbsp;(&nbsp;hWim,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PWideChar(captureDir),&nbsp;&nbsp;&nbsp;//&nbsp;capture&nbsp;directory&nbsp;or&nbsp;drive<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;WIM_FLAG_VERIFY<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//Now&nbsp;we&nbsp;are&nbsp;done<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;SampleCaptureCleanup&nbsp;(hWim,&nbsp;hImg,&nbsp;callback);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetLastError()&nbsp;&lt;&gt;&nbsp;ERROR_SUCCESS)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('Cannot&nbsp;capture&nbsp;image');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br><br>end.
 
OK!谢谢tseug!结题了。
 
后退
顶部