Вы реагируете только на CALLBACK_STREAM_SWITCH
, что в большинстве случаев вы получите только один раз. CopyFileEx
копирует файл в чанки и после каждого чанка вызывает обратный вызов с reson == CALLBACK_CHUNK_FINISHED
. На самом деле вам не нужно различать эти случаи и обрабатывать оба с одним и тем же кодом.
DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD
dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID
lpData)
{
HWND hWndDlg = (HWND)lpData;
static HWND hwndIDC_PROGRESS1;
hwndIDC_PROGRESS1 = GetDlgItem(hWndDlg, IDC_PROGRESS_DATA_OF_RETRIEVING);
DOUBLE Percentage = ((DOUBLE)TotalBytesTransferred.QuadPart /
(DOUBLE)TotalFileSize.QuadPart) * 100;
/* If you copy on GUI thread, you need to pump messages with
while ( PeekMessage( ... ) ) { ... }
*/
return cancel_Copy_File ? PROGRESS_CANCEL : PROGRESS_CONTINUE;
}