The code is:
// When user presses the start button
void DataCryptMain ::ProcessCrypt()
{
...
cryptthread.Start(_staticThreadProc, this)
...
}
// Crypt procedures
DWORD WINAPI _staticThreadProc(LPVOID lpData)
{
DataCryptMain *dcr = reinterpret_cast(lpData);
return dcr->CryptThreadProc(NULL);
}
DWORD WINAPI DataCryptMain::CryptThreadProc(LPVOID lpData)
{
int iErrorOrInfo = INFO_PROCESS_DONE;
// Ciphering stuff
iErrorOrInfo = CryptoRijnDaelProcess();
Notify_Progress_GUI(NOTIFY_PROGRESS_END, NULL, iErrorOrInfo);
return 0;
}
// Notify GUI
void DataCryptMain::Notify_Progress_GUI(int iNotificationType, WPARAM wParam, LPARAM lParam)
{
if (iNotificationType == NOTIFY_PROGRESS_RUNNING)
{
PostMessage(hWnd, WM_PROGRESS_RUNNING, wParam, lParam);
}
else
{
PostMessage(hWnd, WM_PROGRESS_END, wParam, lParam);
}
}
// Call back procedure from inside Encrypt()
bool _ProgressBarProc(PRBDATA *prbdata)
{
DataCryptMain *dcr = reinterpret_cast(prbdata->lpOtherData);
return dcr->ProgressBarProc(prbdata);
}
bool DataCryptMain::ProgressBarProc(PRBDATA *prbdata)
{
if (cryptthread.WaitToExit()) return TRUE;
PRBDATA *_prbdata = new PRBDATA;
memcpy(_prbdata, prbdata, sizeof(PRBDATA));
Notify_Progress_GUI(NOTIFY_PROGRESS_RUNNING, NULL, (LPARAM)_prbdata);
return FALSE;
}
// Rijndael processing
int DataCryptMain::CryptoRijnDaelProcess()
{
int iErrorOrInfo = OK;
RijnDaelCrypto *rdc = new RijnDaelCrypto;
...
...
// Set progress bar function
SetProgressFunc(_ProgressBarProc, (LPVOID)this);
------------------- Here this function loops through the file encryption
if (rdc->Encrypt(wcgFileNameIn, wcgFileNameOut, cryptParams.iCipherMode) < 0)
iErrorOrInfo = ERR_PROCESS_STOPPED_BY_USER;
_DELETE(rdc);
return iErrorOrInfo;
}
//WM_PROGRESS_RUNNING
bool DataCryptMain::OnProgressRunning(WPARAM wParam, LPARAM lParam)
{
float fPercent[3];
char sTemp[64];
PRBDATA \*prbdata = reinterpret\_cast(lParam);
// Percent % read file
fPercent\[0\] = ((float)prbdata->iReadBytesIncByFuncRead / (float)prbdata->dwSize) \* 100.0f;
// Percent % block/s processed
fPercent\[1\] = ((float)prbdata->iBlocksIncrement / (float)prbdata->iBlocksNum) \* 100.0f;
// Average percent
fPercent\[2\] = (fPercent\[0\] + fPercent\[1\]) / 2;
SendDlgItemMessage(hWnd, IDC\_PROGRESSSTATUS, PBM\_SETPOS, (WPARAM)fPercent\[2\], 0);
// Display progress bar's percent value
sprintf\_s(sTemp, "%0.1f %%", fPercent\[