⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maindlg.cpp

📁 嵌入式DOS系统上位升级程序FileUpgrade, 需配合本人上传的FileUpr程序应用, VC++开发, 非常实用, 内附说明及源码
💻 CPP
字号:
// MainDlg.cpp : implementation file
//

#include "stdafx.h"
#include "文件升级.h"
#include "MainDlg.h"
#include "MessageEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "DataOperator.h"
CDataOperator gDataOperator;

CEdit	m_SuccRatioEditCtrl;
CMessageEdit  m_MsgEdit;

#define SaveDataFile "\\FileUpgrade.dat"
void ReadSaveDataFile(CString &cs)
{
	char buf[2048]={0};
	GetWindowsDirectory(buf,1024);
	strcat(buf,SaveDataFile);
	FILE *fp;
	fp=fopen(buf,"rb");
	if(fp)
	{
		fread(buf,2048,1,fp);
		fclose(fp);
		cs=buf;
	}
	else cs="";
	
}
void WriteSaveDataFile(const char *str)
{
	FILE *fp;
	char buf[1024]={0};
	GetWindowsDirectory(buf,1024);
	strcat(buf,SaveDataFile);
	fp=fopen(buf,"wb");
	if(fp)
	{
		fwrite(str,strlen(str),1,fp);
		fclose(fp);
	}
}


/////////////////////////////////////////////////////////////////////////////
// CMainDlg dialog

CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMainDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMainDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
}

void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMainDlg)
	DDX_Control(pDX, IDC_FileNameEDIT, m_FileNameEditCtrl);
	DDX_Control(pDX, IDC_SuccRatioEDIT, m_SuccRatioEditCtrl);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
	//{{AFX_MSG_MAP(CMainDlg)
	ON_CBN_SELCHANGE(IDC_BaudRatioComboBox, OnSelchangeBaudRatioComboBox)
	ON_CBN_SELCHANGE(IDC_CommPortNo, OnSelchangeCommPortNo)
	ON_BN_CLICKED(IDC_Exit, OnExit)
	ON_BN_CLICKED(IDC_BeginSendFile, OnBeginSendFile)
	ON_BN_CLICKED(IDC_StopBUTTON, OnStopBUTTON)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_WorkModelCHECK, OnWorkModelCHECK)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainDlg message handlers

BOOL CMainDlg::OnInitDialog()
{
	extern void OpenTimerTick(CWnd *ptrWnd);
	CDialog::OnInitDialog();

	OpenTimerTick(this);

	//编辑框
	m_MsgEdit.SubclassDlgItem(IDC_MsgEDIT,this);

	m_UprComputerNoEditCtrl.SubclassDlgItem(IDC_ComputerNoEDIT,this,DECINT_TYPE);
	m_UprComputerNoEditCtrl.LimitText(10);

	CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ; 
	if (pMenu)
	{
			pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ; 
			pMenu->EnableMenuItem(SC_MINIMIZE, MF_BYCOMMAND|MF_GRAYED) ; 
			pMenu->EnableMenuItem(SC_MAXIMIZE, MF_BYCOMMAND|MF_GRAYED) ; 
	}
	CenterWindow();

	((CComboBox*)GetDlgItem(IDC_BaudRatioComboBox))->SetCurSel(6);
	//端口
	if(gDataOperator.sio_open(1,GetBaudRate()))
		((CComboBox*)GetDlgItem(IDC_CommPortNo))->SetCurSel(-1);
	else
		((CComboBox*)GetDlgItem(IDC_CommPortNo))->SetCurSel(0);


	((CComboBox*)GetDlgItem(IDC_ConnectModelCOMBO))->SetCurSel(1);//0=主动 1=被动连接
	((CComboBox*)GetDlgItem(IDC_PackageSizeCOMBO))->SetCurSel(1);
	((CComboBox*)GetDlgItem(IDC_IntervalTimeCOMBO))->SetCurSel(1);
	m_FileNameEditCtrl.SetLimitText(1024);

	OnWorkModelCHECK();

//	m_FileNameEditCtrl.SetWindowText("c:\\1.exe,ww1.ini\r\nc:\\2.exe,ww2.ini");
	CString cs;
	ReadSaveDataFile(cs);
	m_FileNameEditCtrl.SetWindowText(cs);
		
	
	return TRUE;
}

long int CMainDlg::GetBaudRate()
{
	return GetDlgItemInt(IDC_BaudRatioComboBox);
}


void CMainDlg::OnSelchangeBaudRatioComboBox() 
{
	gDataOperator.sio_baud((unsigned short )GetBaudRate());
}

void CMainDlg::OnSelchangeCommPortNo() 
{
	short int NewPort=((CComboBox*)GetDlgItem(IDC_CommPortNo))->GetCurSel()+1;
	if(gDataOperator.sio_open(NewPort,GetBaudRate()))
	{
		CString cs;
		cs.Format("不能打开串口Com%d\n串口Com%d已经被使用或不存在",NewPort,NewPort);
		MessageBox(cs,"错误",MB_OK|MB_ICONEXCLAMATION);
		((CComboBox*)GetDlgItem(IDC_CommPortNo))->SetCurSel(-1);
	} 	
}
void CMainDlg::OnExit() 
{
	extern void KillTimerTick();
	KillTimerTick();
	CDialog::OnOK();
	
}

UINT ID[]={IDC_Exit,IDC_BeginSendFile,IDC_CommPortNo,IDC_BaudRatioComboBox,IDC_PackageSizeCOMBO,IDC_IntervalTimeCOMBO,IDC_ConnectModelCOMBO,IDC_WorkModelCHECK};
void CMainDlg::UpgradeEnd()
{
	int t=sizeof(ID)/sizeof(UINT);
	while(t)
	{
		GetDlgItem(ID[t-1])->EnableWindow(1);
		t--;
	}
	GetDlgItem(IDC_StopBUTTON)->EnableWindow(0);
	OnWorkModelCHECK();
}
void CMainDlg::UpgradeStart()
{
	int t=sizeof(ID)/sizeof(UINT);
	while(t)
	{
		GetDlgItem(ID[t-1])->EnableWindow(0);
		t--;
	}
	GetDlgItem(IDC_StopBUTTON)->EnableWindow(1);
}
UINT CMainDlg::SendFileThreadProc( LPVOID pParam )
{
	((CMainDlg*)pParam)->UpgradeStart();
	gDataOperator.Start();
	((CMainDlg*)pParam)->UpgradeEnd();
	return 0;
}
void CMainDlg::OnBeginSendFile() 
{
	//检测传输文件的合法性。
	if(GetTransferFileName()) return;

	short int CurSel;	
	
	CurSel=((CComboBox*)GetDlgItem(IDC_ConnectModelCOMBO))->GetCurSel();//0=主动,1=被动
	gDataOperator.SetConnectModel(CurSel);
	
	CurSel=((CComboBox*)GetDlgItem(IDC_PackageSizeCOMBO))->GetCurSel();
	if(CurSel==0) gDataOperator.SetPackageSize(512);
	else gDataOperator.SetPackageSize(CurSel*1024);

	CurSel=((CComboBox*)GetDlgItem(IDC_IntervalTimeCOMBO))->GetCurSel();
	gDataOperator.SetSendIntervalSecond(CurSel+1);

	CurSel=((CButton*)GetDlgItem(IDC_WorkModelCHECK))->GetCheck();//1=交互式传输。
	gDataOperator.SetWorkModel(CurSel);

	gDataOperator.mExitSystemMark=0;

	gDataOperator.SetObjComputerNo(m_UprComputerNoEditCtrl.GetLongValue());


	CString cs;
	m_FileNameEditCtrl.GetWindowText(cs);
	WriteSaveDataFile(cs);

	m_SendThread=AfxBeginThread(SendFileThreadProc,this);
}

void CMainDlg::OnStopBUTTON() 
{
	gDataOperator.mExitSystemMark=1;
}

void CMainDlg::OnButton1() 
{
	m_MsgEdit.SetWindowText("");
}



int CMainDlg::GetTransferFileName()//1=不合理,无法升级
{
	char *DOS_ERROR_Msg="有错误,目标文件名不符合DOS命名规则";

	CString cs;
	CFileStatus  rStatus; 
	char *ptrMsg;
	char src[128],obj[128];
	char buf[256],*ptr,*ptrObj;
	int index,LineCount=m_FileNameEditCtrl.GetLineCount( );
	int Len;
	unsigned char SendFileCount=0;
	int k;

	m_MsgEdit.EditPrintf("\r\n............分析传输的文件名.........");
	for(index=0;index<LineCount;index++)
	{
		Len=m_FileNameEditCtrl.GetLine(index,buf,256);
		buf[Len]=0;
		if(Len==0) continue;
		//有并只能有一个逗号。分解源文件和目标文件。
		ptr=buf;
		while(isspace(*ptr)) ptr++;
		if(*ptr==0) continue;

		ptrObj=src;
		for(;*ptr && *ptr!=',';ptr++,ptrObj++) *ptrObj=*ptr;
		*ptrObj=0;
		if(*ptr==0)
		{
			ptrMsg="有错误。";
			goto Error_END;
		}

		ptr++;while(isspace(*ptr)) ptr++;
		ptrObj=obj;
		for(;*ptr && *ptr!=',';ptr++,ptrObj++)*ptrObj=*ptr;
		*ptrObj=0;
		//删除尾部空格
		ptrObj=obj;
		if(*ptrObj)
		{
			while(*ptrObj) ptrObj++;
			ptrObj--;
			while(isspace(*ptrObj)){*ptrObj=0;ptrObj--;}
		}
		//检测源文件合法性.
		if(!CFile::GetStatus(src,rStatus))
		{
			ptrMsg="有错误,源文件不存在";
			goto Error_END;
		}
		//检验目标文件合法性。
		short NameLen;
		short HaveDotMark=0;
		ptrObj=obj;
		if(*ptrObj!='\\' && isalpha(*ptrObj)==0 && *ptrObj!='_')//开头必须为字母
		{
			ptrMsg=DOS_ERROR_Msg;
			goto Error_END;
		}
		NameLen=9;
		for(;*ptrObj;ptrObj++)
		{
			if(*ptrObj=='\\')
			{
				if(isalnum(*(ptrObj+1))==0){ptrMsg=DOS_ERROR_Msg;goto Error_END;}
				NameLen=9;
			}
			else if(*ptrObj=='.')
			{
				if(HaveDotMark || isalnum(*(ptrObj+1))==0){ptrMsg=DOS_ERROR_Msg;goto Error_END;}
				NameLen=4;
				HaveDotMark=1;
			}
			else if(isalnum(*ptrObj)==0 &&  *ptrObj!='_')
			{
				ptrMsg=DOS_ERROR_Msg;
				goto Error_END;
			}
			else NameLen--;
			
			if(NameLen==0){ptrMsg=DOS_ERROR_Msg;goto Error_END;}
		}
		m_MsgEdit.EditPrintf("\r\n源文件:%s   目标:%s",src,obj);
		for(k=0;k<SendFileCount;k++)
		{
			if(gDataOperator.mDowloadFileMsg.Name[k].srcName==src)
			{
				MessageBox("有两个源文件相同,请重新设置!!");
				return 1;
			}
			else if(gDataOperator.mDowloadFileMsg.Name[k].objName==obj)
			{
				MessageBox("有两个目标文件相同,请重新设置!!");
				return 1;
			}
		}
		
		gDataOperator.mDowloadFileMsg.Name[SendFileCount].srcName=src;
		gDataOperator.mDowloadFileMsg.Name[SendFileCount].objName=obj;
		SendFileCount++;
	}
	//检测文件名。
	gDataOperator.mDowloadFileMsg.Count=SendFileCount;
	cs.Format("下载%u个文件,下载的文件名和目标:",SendFileCount);
	for(k=0;k<SendFileCount;k++)
	{
		cs+="\r\n源文件:";
		cs+=gDataOperator.mDowloadFileMsg.Name[k].srcName;
		cs+="-->目标文件:";
		cs+=gDataOperator.mDowloadFileMsg.Name[k].objName;
	}
	
	if(MessageBox(cs,"请确定",MB_OKCANCEL|MB_ICONWARNING)==IDOK && SendFileCount>0) return 0;
	return 1;
Error_END:

	cs.Format("%d行\n%s\n%s",index+1,buf,ptrMsg);
	MessageBox(cs);
	return 1;
}

void CMainDlg::OnWorkModelCHECK() 
{
	int cursel=((CButton*)GetDlgItem(IDC_WorkModelCHECK))->GetCheck();

	GetDlgItem(IDC_IntervalTimeCOMBO)->EnableWindow(!cursel);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -