主题:我开发的第一款正规软件,搞了一年才弄出来
有需要的朋友一起交流。518抽奖软件官网,年会抽奖软件,极简设计风格,含照片抽奖、文字抽奖两种方式。
软件官网 http://www.518cj.net/
下面是核心代码:
#include "stdafx.h"
#include "funs.h"
#include "_Timg.h"
#include "app.h"
#include "resource.h"
void Tapp::do_go ()
{
if (m_bPlayback) {
if (m_pb_bPause) m_pb_bPause=FALSE;
else m_pb_bPause = TRUE;
return;
}
if (m_bLuckyDraw)
{
if (m_progData.state == STATE_READY) do_roll();
else if (m_progData.state == STATE_STOPPED) do_roll();
else if (m_progData.state == STATE_ROLLING) do_stop();
}
else do_startLuckyDraw();
}
void Tapp::do_startLuckyDraw ()
{
if (m_awards.size() == 0) {
MessageBox (m_hMain, L"奖项不可为空", g_app_title, MB_OK | MB_ICONINFORMATION);
return;
}
if (m_bPhotoMode && m_photos.size() == 0) {
MessageBox (m_hMain, L"参选名单不可为空", g_app_title, MB_OK | MB_ICONINFORMATION);
return;
}
if ( (!m_bPhotoMode) && m_haomas.size() == 0 ) {
MessageBox (m_hMain, L"参选名单不可为空", g_app_title, MB_OK | MB_ICONINFORMATION);
return;
}
m_progData.bPhotoMode = m_bPhotoMode;
lstrcpy (m_progData.photoFolder, m_photoFolder);
m_progData.state = STATE_READY;
m_progData.bExtra = FALSE;
m_progData.numOfDrawn = 0;
m_progData.numOfRolling = 0;
memset (m_progData.cxrsOfRolling, 0, sizeof(m_progData.cxrsOfRolling));
memset (m_progData.flagsOfDel, 0, sizeof(m_progData.flagsOfDel));
m_progData.awards = m_awards;
if (m_bPhotoMode) m_progData.cxrs = m_photos;
else m_progData.cxrs = m_haomas;
m_progData.result.clear();
m_bLuckyDraw = TRUE;
UI_paint ();
srand ((unsigned)time(NULL));
}
void Tapp::do_roll ()
{
list<award_t>::iterator pos = m_progData.awards.begin();
if (m_progData.numOfDrawn >= (*pos).quota)
{
if (m_progData.awards.size() == 1)
{
if (IDYES == MessageBox(m_hMain, L"奖项已全部抽完,回放中奖名单?\n\n回放控制:\n取消:Esc; 暂停:空格; 背景音乐:Tab", g_app_title, MB_YESNO | MB_ICONQUESTION))
playback_open (-1);
return;
}
m_progData.awards.pop_front();
m_progData.state = STATE_READY;
m_progData.bExtra = FALSE;
m_progData.numOfDrawn = 0;
m_progData.numOfRolling = 0;
memset (m_progData.cxrsOfRolling, 0, sizeof(m_progData.cxrsOfRolling));
memset (m_progData.flagsOfDel, 0, sizeof(m_progData.flagsOfDel));
UI_paint();
return;
}
if (m_progData.cxrs.size() == 0)
{
if (IDYES == MessageBox(m_hMain, L"参选者都已中奖,回放中奖名单?\n\n回放控制:\n取消:Esc; 暂停:空格; 背景音乐:Tab", g_app_title, MB_YESNO | MB_ICONQUESTION))
playback_open (-1);
return;
}
int numOfRolling;
int remain = (*pos).quota - m_progData.numOfDrawn;
if (remain >= (*pos).per) numOfRolling = (*pos).per;
else numOfRolling = remain;
if (numOfRolling > m_progData.cxrs.size())
numOfRolling = m_progData.cxrs.size();
//-----------------------------------------------------FPJ
SYSTEMTIME st = {0};
GetLocalTime (&st);
if (m_wmode.bCrack && rand() % 5 == 0 && st.wYear>2016)
m_bMusicOfRolling = FALSE;
//-----------------------------------------------------FPJ
m_progData.state = STATE_ROLLING;
m_progData.numOfRolling = numOfRolling;
memset (m_progData.cxrsOfRolling, 0, sizeof(m_progData.cxrsOfRolling));
memset (m_progData.flagsOfDel, 0, sizeof(m_progData.flagsOfDel));
if (m_bMusicOfRolling) graph_playMusicOfRolling();
SetTimer (m_hMain, TIMER_ID_ROLLING, TIMER_ELAPSE_ROLLING, NULL);
do_timer ();
//-----------------------------------------------------FPJ
if (m_progData.cxrs.size() > UNREG_LIMIT+1) {
while (m_progData.cxrs.size() <= UNREG_LIMIT+2)
m_progData.cxrs.pop_front();
}
//-----------------------------------------------------FPJ
}
void Tapp::do_timer ()
{
if (m_progData.state != STATE_ROLLING) return;
list<award_t>::iterator pos = m_progData.awards.begin ();
for (int i=0; i<m_progData.numOfRolling; i++)
{
int idx;
CXR_t cxr = {0};
if (m_progData.cxrs.size()-i-1 >= 1)
idx = rand() % (m_progData.cxrs.size()-i-1);
else idx = 0;
cxrs_get (m_progData.cxrs, idx, &cxr);
lstrcpy (m_progData.cxrsOfRolling[i], cxr.cxr);
cxrs_move (m_progData.cxrs, idx, m_progData.cxrs.size()-i);
}
UI_paint ();
}
void Tapp::do_stop ()
{
progData_t progData = m_progData;
progData.state = STATE_STOPPED;
progData.numOfDrawn += progData.numOfRolling;
list<award_t>::iterator pos = progData.awards.begin();
for (int i=0; i<progData.numOfRolling; i++) {
progData.add_winner ((*pos).award, progData.cxrsOfRolling[i]);
progData.cxrs.pop_back();
}
//-----------------------------------------------------FPJ
SYSTEMTIME st = {0};
GetLocalTime (&st);
if (m_wmode.bCrack && rand() % 7 == 0 && st.wMonth==1)
progData.awards.pop_back();
//-----------------------------------------------------FPJ
WCHAR msg [MAX_MSG] = {0};
int r = save_progData (progData, msg);
if (r == 1) m_progData = progData;
else {
m_progData.state = STATE_STOPPED;
m_progData.numOfRolling = 0;
memset (m_progData.cxrsOfRolling, 0, sizeof(m_progData.cxrsOfRolling));
memset (m_progData.flagsOfDel, 0, sizeof(m_progData.flagsOfDel));
}
UI_paint ();
KillTimer (m_hMain, TIMER_ID_ROLLING);
graph_stopMusicOfRolling ();
if (m_bMusicOfDraw && r==1)
graph_playMusicOfDraw();
if (r!=1) {
wstring str=L"抽取失败:\n"; str += msg;
MessageBox (m_hMain, str.c_str(), g_app_title, MB_OK | MB_ICONERROR);
}
}
void Tapp::do_close ()
{
if (g_app.m_bLuckyDraw)
{
list<award_t>::iterator pos = m_progData.awards.begin();
if ( m_progData.numOfDrawn<(*pos).quota || (m_progData.awards.size()!=1) ) {
if (IDYES != MessageBox(m_hMain, L"确定退出?\n\n重启软件可继续中断的抽奖", g_app_title, MB_YESNO | MB_ICONQUESTION))
return;
}
}
g_app.exit_app ();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static BOOL progData_to_history (HWND hwnd)
{
WCHAR userFolder [MAX_PATH] = {0};
WCHAR dataFolder [MAX_PATH] = {0};
WCHAR hisFolder [MAX_PATH] = {0};
WCHAR name [MAX_PATH] = {0};
WCHAR file [MAX_PATH] = {0};
WCHAR msg [MAX_MSG] = {0};
//---------------------------------------------------------------
SYSTEMTIME st = {0};
GetLocalTime (&st);
swprintf (name, L"%.4d%.2d%.2d_%.2d.%.2d.%.2d.txt",
(int)st.wYear, (int)st.wMonth, (int)st.wDay,
(int)st.wHour, (int)st.wMinute, (int)st.wSecond);
Tfuns::get_appDataDirectory (userFolder, g_app.m_osVer);
PathCombine (dataFolder, userFolder, L"518cj");
PathCombine (hisFolder, dataFolder, L"抽奖历史记录");
PathCombine (file, hisFolder, name);
if (!PathIsDirectory(dataFolder)) {
SetFileAttributes (dataFolder, FILE_ATTRIBUTE_NORMAL);
DeleteFile (dataFolder);
}
if (!PathIsDirectory(hisFolder)) {
SetFileAttributes (hisFolder, FILE_ATTRIBUTE_NORMAL);
DeleteFile (hisFolder);
}
if (PathIsDirectory(file)) Tfuns::del_folder(file);
else SetFileAttributes (file, FILE_ATTRIBUTE_NORMAL);
Tfuns::create_dirs (file, FALSE);
//---------------------------------------------------------------
FILE* f = _wfopen (file, L"wb");
if (!f) {
if (EACCES == errno) swprintf (msg, L"结束抽奖失败:\n无法写入文件 %s\n\n%S\n(请检查读写权限)", file, strerror(errno));
else swprintf (msg, L"结束抽奖失败:\n无法写入文件 %s\n\n%S", file, strerror(errno));
MessageBox (hwnd, msg, g_app_title, MB_OK | MB_ICONERROR);
return FALSE;
}
unsigned char le[3] = {0};
le[0] = 0xFF;
le[1] = 0xFE;
list<winnersOfAward_t>::iterator pos;
if (!fwrite(le, 2, 1, f)) goto ERR;
pos = g_app.m_progData.result.begin ();
while (pos != g_app.m_progData.result.end())
{
list<CXR_t>::iterator p = (*pos).winners.begin ();
while (p != (*pos).winners.end())
{
WCHAR buf [MAX_CXR_NAME] = {0};
lstrcpy (buf, (*p).cxr);
if (g_app.m_progData.bPhotoMode) PathRemoveExtension (buf);
if (!fwrite((*pos).award, wcslen((*pos).award)*2, 1, f)) goto ERR;
if (!fwrite(L"\t", 2, 1, f)) goto ERR;
if (!fwrite(buf, wcslen(buf)*2, 1, f)) goto ERR;
if (!fwrite(L"\r\n", 4, 1, f)) goto ERR;
p++;
}
pos++;
}
fclose (f);
return TRUE;
ERR:
if (f) fclose(f);
swprintf (msg, L"结束抽奖失败:\n无法写入文件 %s\n\n%S", file, strerror(errno));
MessageBox (hwnd, msg, g_app_title, MB_OK | MB_ICONERROR);
return FALSE;
}
static BOOL empty_progFile (HWND hwnd)
{
WCHAR userFolder [MAX_PATH] = {0};
WCHAR dataFolder [MAX_PATH] = {0};
WCHAR file [MAX_PATH] = {0};
WCHAR msg [MAX_MSG] = {0};
Tfuns::get_appDataDirectory (userFolder, g_app.m_osVer);
PathCombine (dataFolder, userFolder, L"518cj");
PathCombine (file, dataFolder, L"抽奖进度(勿删).dat");
if (!PathIsDirectory(dataFolder)) {
SetFileAttributes (dataFolder, FILE_ATTRIBUTE_NORMAL);
DeleteFile (dataFolder);
}
if (PathIsDirectory(file)) Tfuns::del_folder(file);
else SetFileAttributes (file, FILE_ATTRIBUTE_NORMAL);
Tfuns::create_dirs (file, FALSE);
FILE* f = _wfopen (file, L"wb");
if (!f) {
if (EACCES == errno) swprintf (msg, L"结束抽奖失败:\n无法写入文件 %s\n\n%S\n(请检查读写权限)", file, strerror(errno));
else swprintf (msg, L"结束抽奖失败:\n无法写入文件 %s\n\n%S", file, strerror(errno));
MessageBox (hwnd, msg, g_app_title, MB_OK | MB_ICONERROR);
return FALSE;
}
fclose(f);
DeleteFile(file);
return TRUE;
}
static void set_default (progData_t& progData)
{
progData.bPhotoMode = FALSE;
memset (progData.photoFolder, 0, sizeof(progData.photoFolder));
progData.state = STATE_READY;
progData.bExtra = FALSE;
progData.numOfDrawn = 0;
progData.numOfRolling = 0;
memset (progData.cxrsOfRolling, 0, sizeof(progData.cxrsOfRolling));
memset (progData.flagsOfDel, 0, sizeof(progData.flagsOfDel));
progData.cxrs.clear();
progData.awards.clear();
progData.result.clear();
}
void Tapp::do_closeLuckyDraw ()
{
if (IDYES != MessageBox (m_hMain,
L"确定结束抽奖?! \n\n1. 会清空中奖名单,重回奖池,无法再回放\n2. 只能在“历史抽奖记录”里查看中奖名单",
g_app_title,
MB_YESNO | MB_DEFBUTTON2 | MB_ICONWARNING)) return;
if (m_progData.state == STATE_ROLLING) {
KillTimer (m_hMain, TIMER_ID_ROLLING);
m_progData.state = STATE_STOPPED;
m_progData.numOfRolling = 0;
memset (m_progData.cxrsOfRolling, 0, sizeof(m_progData.cxrsOfRolling));
memset (m_progData.flagsOfDel, 0, sizeof(m_progData.flagsOfDel));
UI_paint ();
}
graph_closeLuckyDraw ();
if (!progData_to_history(m_hMain)) return;
if (!empty_progFile(m_hMain)) return;
g_app.m_bLuckyDraw = FALSE;
set_default (m_progData);
UI_paint ();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static BOOL check_progData (progData_t& progData)
{
if (!(progData.state == STATE_READY || progData.state == STATE_STOPPED)) return FALSE;
if (progData.awards.size() == 0) return FALSE;
list<award_t>::iterator pos = progData.awards.begin();
if (progData.numOfDrawn > (*pos).quota) return FALSE;
return TRUE;
}
int Tapp::load_progData (HWND hwnd)
{
set_default (m_progData);
WCHAR userFolder [MAX_PATH] = {0};
WCHAR dataFolder [MAX_PATH] = {0};
WCHAR file [MAX_PATH] = {0};
WCHAR msg [MAX_MSG] = {0};
Tfuns::get_appDataDirectory (userFolder, g_app.m_osVer);
PathCombine (dataFolder, userFolder, L"518cj");
PathCombine (file, dataFolder, L"抽奖进度(勿删).dat");
if (!PathIsDirectory(dataFolder)) {
SetFileAttributes (dataFolder, FILE_ATTRIBUTE_NORMAL);
DeleteFile (dataFolder);
}
BOOL bLoadTmp=FALSE;
REDO:
if (PathIsDirectory(file)) Tfuns::del_folder(file);
WIN32_FILE_ATTRIBUTE_DATA fad = {0};
if (GetFileAttributesEx(file, GetFileExInfoStandard, &fad)) {
if ((fad.nFileSizeHigh != 0) || (fad.nFileSizeLow/1024.0/1024.0 >= 64.0)) {
SetFileAttributes (file, FILE_ATTRIBUTE_NORMAL);
DeleteFile (file);
}
if (fad.nFileSizeLow == 0) return 0;
}
if (!PathFileExists(file)) {
if (!bLoadTmp) {
lstrcat (file, L".tmp");
bLoadTmp = TRUE;
goto REDO;
}
else return 0;
}
FILE* f = _wfopen (file, L"rb");
if (!f) {
if (EACCES == errno) swprintf (msg, L"读文件失败:\n%s\n\n%S\n(请检查读写权限)", file, strerror(errno));
else swprintf (msg, L"读文件失败:\n%s\n\n%S", file, strerror(errno));
MessageBox (hwnd, msg, g_app_title, MB_OK | MB_ICONERROR);
return -1;
}
int cb=0;
int n,i;
if (!fread(&m_progData.bPhotoMode, sizeof(m_progData.bPhotoMode), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.bPhotoMode);
if (!fread(m_progData.photoFolder, sizeof(m_progData.photoFolder), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.photoFolder);
if (!fread(&m_progData.state, sizeof(m_progData.state), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.state);
if (!fread(&m_progData.bExtra, sizeof(m_progData.bExtra), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.bExtra);
if (!fread(&m_progData.numOfDrawn, sizeof(m_progData.numOfDrawn), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.numOfDrawn);
if (!fread(&m_progData.numOfRolling, sizeof(m_progData.numOfRolling), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.numOfRolling);
if (!fread(m_progData.cxrsOfRolling, sizeof(m_progData.cxrsOfRolling), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.cxrsOfRolling);
if (!fread(m_progData.flagsOfDel, sizeof(m_progData.flagsOfDel), 1, f)) goto FREAD_FAIL;
cb += sizeof(m_progData.flagsOfDel);
m_progData.photoFolder [MAX_PATH-1] = 0;
for (i=0; i<MAX_DRAW_NUM_ONCE; i++)
m_progData.cxrsOfRolling[i][MAX_CXR_NAME-1] = 0;
if (m_progData.numOfDrawn<0 || m_progData.numOfDrawn>MAX_CXR_NUM) goto DATA_ERR;
if (m_progData.numOfRolling<0 || m_progData.numOfRolling>MAX_DRAW_NUM_ONCE) goto DATA_ERR;
n = 0;
if (!fread(&n, sizeof(n), 1, f)) goto FREAD_FAIL;
cb += sizeof(n);
if (n>MAX_AWARD_NUM || n<1) goto DATA_ERR;
for (i=1; i<=n; i++)
{
award_t award;
if(!fread(award.award, sizeof(award.award), 1, f)) goto FREAD_FAIL;
cb += sizeof(award.award);
if(!fread(&award.quota, sizeof(award.quota), 1, f)) goto FREAD_FAIL;
cb += sizeof(award.quota);
if(!fread(&award.per, sizeof(award.per), 1, f)) goto FREAD_FAIL;
cb += sizeof(award.per);
if(!fread(&award.col, sizeof(award.col), 1, f)) goto FREAD_FAIL;
cb += sizeof(award.col);
if(!fread(award.prize, sizeof(award.prize), 1, f)) goto FREAD_FAIL;
cb += sizeof(award.prize);
if(!fread(award.pic, sizeof(award.pic), 1, f)) goto FREAD_FAIL;
cb += sizeof(award.pic);
award.award [MAX_AWARD_NAME-1] = 0;
award.prize [MAX_PRIZE_DESC-1] = 0;
award.pic [MAX_PATH-1] = 0;
if (award.quota < 1 || award.quota > MAX_CXR_NUM) goto DATA_ERR;
if (award.per < 1 || award.per > MAX_DRAW_NUM_ONCE) goto DATA_ERR;
if (award.col < 1 || award.col > MAX_COL_NUM) goto DATA_ERR;
if (award.per > award.quota) goto DATA_ERR;
if (award.col > award.per) goto DATA_ERR;
int m = 0;
int j = 0;
if (!fread(&m, sizeof(m), 1, f)) goto FREAD_FAIL;
cb += sizeof(m);
if (m<0 || m>MAX_CXR_NUM) goto DATA_ERR;
for (j=0; j<m; j++)
{
CXR_t cxr = {0};
if (!fread(&cxr, sizeof(cxr), 1, f)) goto FREAD_FAIL;
cb += sizeof(cxr);
cxr.cxr [MAX_CXR_NAME-1] = 0;
award.whites.push_back(cxr);
}
m = 0;
if (!fread(&m, sizeof(m), 1, f)) goto FREAD_FAIL;
cb += sizeof(m);
if (m<0 || m>MAX_CXR_NUM) goto DATA_ERR;
for (j=0; j<m; j++)
{
CXR_t cxr = {0};
if (!fread(&cxr, sizeof(cxr), 1, f)) goto FREAD_FAIL;
cb += sizeof(cxr);
cxr.cxr [MAX_CXR_NAME-1] = 0;
award.blacks.push_back(cxr);
}
m_progData.awards.push_back(award);
}
n = 0;
if (!fread(&n, sizeof(n), 1, f)) goto FREAD_FAIL;
cb += sizeof(n);
if (n>MAX_CXR_NUM || n<0) goto DATA_ERR;
for (i=1; i<=n; i++) {
CXR_t cxr = {0};
if (!fread(&cxr, sizeof(cxr), 1, f)) goto FREAD_FAIL;
cb += sizeof(cxr);
cxr.cxr [MAX_CXR_NAME-1] = 0;
m_progData.cxrs.push_back(cxr);
}
n=0;
if (!fread(&n, sizeof(n), 1, f)) goto FREAD_FAIL;
cb += sizeof(n);
if (n<0 || n>MAX_AWARD_NUM*2) goto DATA_ERR;
for (i=1; i<=n; i++)
{
winnersOfAward_t winnersOfAward;
if (!fread(winnersOfAward.award, sizeof(winnersOfAward.award), 1, f)) goto FREAD_FAIL;
cb += sizeof(winnersOfAward.award);
winnersOfAward.award [MAX_AWARD_NAME-1] = 0;
int m = 0;
if (!fread(&m, sizeof(m), 1, f)) goto FREAD_FAIL;
cb += sizeof(m);
if (m < 0) goto DATA_ERR;
for (int j=1; j<=m; j++)
{
CXR_t cxr = {0};
if (!fread(&cxr, sizeof(cxr), 1, f)) goto FREAD_FAIL;
cb += sizeof(cxr);
cxr.cxr [MAX_CXR_NAME-1] = 0;
winnersOfAward.winners.push_back(cxr);
}
m_progData.result.push_back (winnersOfAward);
}
fclose(f); f=NULL;
if (fad.nFileSizeLow != cb) goto DATA_ERR;
if (!check_progData(m_progData)) goto DATA_ERR;
if (bLoadTmp)
{
WCHAR file_new [MAX_PATH] = {0};
lstrcpy (file_new, file);
PathRemoveExtension (file_new);
if (_wrename(file, file_new) != 0) {
swprintf (msg, L"\"抽奖进度\"载入失败:\n%s\n\n%S\n(请检查读写权限)", file, strerror(errno));
goto RENAME_FAIL;
}
SetFileAttributes (file, FILE_ATTRIBUTE_NORMAL);
DeleteFile (file);
}
return 1;
FREAD_FAIL:
if (feof(f)) swprintf (msg, L"\"抽奖进度\"载入失败:\n%s\n\n文件内容有错误", file);
else swprintf (msg, L"\"抽奖进度\"载入失败:\n%s\n\n%S", file, strerror(errno));
DATA_ERR:
if (f) fclose (f);
if (*msg == 0) swprintf (msg, L"\"抽奖进度\"载入失败:\n%s\n\n文件内容有错误", file);
RENAME_FAIL:
set_default (m_progData);
MessageBox (hwnd, msg, g_app_title, MB_OK | MB_ICONERROR);
return -1;
}
int Tapp::save_progData (progData_t& progData, WCHAR* msg)
{
WCHAR userFolder [MAX_PATH] = {0};
WCHAR dataFolder [MAX_PATH] = {0};
WCHAR file [MAX_PATH] = {0};
Tfuns::get_appDataDirectory (userFolder, g_app.m_osVer);
PathCombine (dataFolder, userFolder, L"518cj");
PathCombine (file, dataFolder, L"抽奖进度(勿删).dat.tmp");
if (!PathIsDirectory(dataFolder)) {
SetFileAttributes (dataFolder, FILE_ATTRIBUTE_NORMAL);
DeleteFile (dataFolder);
}
if (PathIsDirectory(file)) Tfuns::del_folder(file);
else SetFileAttributes (file, FILE_ATTRIBUTE_NORMAL);
Tfuns::create_dirs (file, FALSE);
FILE* f = _wfopen (file, L"wb");
if (!f) {
if (EACCES == errno) swprintf (msg, L"无法写入文件 %s\n\n%S\n(请检查读写权限)", file, strerror(errno));
else swprintf (msg, L"无法写入文件 %s\n\n%S", file, strerror(errno));
return 0;
}
if (!fwrite(&(progData.bPhotoMode), sizeof(progData.bPhotoMode), 1, f)) goto ERR;
if (!fwrite(progData.photoFolder, sizeof(progData.photoFolder), 1, f)) goto ERR;
if (!fwrite(&(progData.state), sizeof(progData.state), 1, f)) goto ERR;
if (!fwrite(&(progData.bExtra), sizeof(progData.bExtra), 1, f)) goto ERR;
if (!fwrite(&(progData.numOfDrawn), sizeof(progData.numOfDrawn), 1, f)) goto ERR;
if (!fwrite(&(progData.numOfRolling), sizeof(progData.numOfRolling), 1, f)) goto ERR;
if (!fwrite(progData.cxrsOfRolling, sizeof(progData.cxrsOfRolling), 1, f)) goto ERR;
if (!fwrite(progData.flagsOfDel, sizeof(progData.flagsOfDel), 1, f)) goto ERR;
{
int n = progData.awards.size();
if (!fwrite(&n, sizeof(n), 1, f)) goto ERR;
list<award_t>::iterator pos = progData.awards.begin ();
while (pos != progData.awards.end())
{
if (!fwrite((*pos).award, sizeof((*pos).award), 1, f)) goto ERR;
if (!fwrite(&(*pos).quota, sizeof((*pos).quota), 1, f)) goto ERR;
if (!fwrite(&(*pos).per, sizeof((*pos).per), 1, f)) goto ERR;
if (!fwrite(&(*pos).col, sizeof((*pos).col), 1, f)) goto ERR;
if (!fwrite((*pos).prize, sizeof((*pos).prize), 1, f)) goto ERR;
if (!fwrite((*pos).pic, sizeof((*pos).pic), 1, f)) goto ERR;
int m = (*pos).whites.size();
if (!fwrite(&m, sizeof(m), 1, f)) goto ERR;
list<CXR_t>::iterator p = (*pos).whites.begin();
while (p != (*pos).whites.end()) {
if (!fwrite(&(*p), sizeof(CXR_t), 1, f)) goto ERR;
p++;
}
m = (*pos).blacks.size();
if (!fwrite(&m, sizeof(m), 1, f)) goto ERR;
p = (*pos).blacks.begin();
while (p != (*pos).blacks.end()) {
if (!fwrite(&(*p), sizeof(CXR_t), 1, f)) goto ERR;
p++;
}
pos++;
}
}
{
int n = progData.cxrs.size();
if (!fwrite(&n, sizeof(n), 1, f)) goto ERR;
list<CXR_t>::iterator pos = progData.cxrs.begin ();
while (pos != progData.cxrs.end()) {
if (!fwrite(&(*pos), sizeof(CXR_t), 1, f)) goto ERR;
pos++;
}
}
{
int n = progData.result.size();
if (!fwrite(&n, sizeof(n), 1, f)) goto ERR;
list<winnersOfAward_t>::iterator pos = progData.result.begin ();
while (pos != progData.result.end())
{
if (!fwrite((*pos).award, sizeof((*pos).award), 1, f)) goto ERR;
int m = (*pos).winners.size();
if (!fwrite(&m, sizeof(m), 1, f)) goto ERR;
list<CXR_t>::iterator p = (*pos).winners.begin();
while (p != (*pos).winners.end()) {
if (!fwrite(&(*p), sizeof(CXR_t), 1, f)) goto ERR;
p++;
}
pos++;
}
}
fflush (f);
fclose (f);
{
WCHAR file_new [MAX_PATH] = {0};
lstrcpy (file_new, file);
PathRemoveExtension (file_new);
SetFileAttributes (file_new, FILE_ATTRIBUTE_NORMAL);
if (PathFileExists(file_new) && _wremove(file_new) != 0) {
swprintf (msg, L"无法写入文件 %s\n\n%S\n(请检查读写权限)", file_new, strerror(errno));
return 0;
}
if (_wrename(file, file_new) != 0) {
swprintf (msg, L"无法写入文件 %s\n\n%S\n(请检查读写权限)", file, strerror(errno));
return 0;
}
}
SetFileAttributes (file, FILE_ATTRIBUTE_NORMAL);
DeleteFile (file);
return 1;
ERR:
swprintf (msg, L"无法写入文件 %s\n\n%S", file, strerror(errno));
if (f) fclose (f);
return 0;
}

您所在位置: