📄 mainfrm.cpp
字号:
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CFrameWnd::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
CString te;
m_wndDlgBar.GetDlgItemText(IDC_WEBPATH,te);
strcpy(sProjectAttrib[iNowProjectNo][4],te);
// TODO: Add your control notification handler code here
}
UINT MyFtpUpThreadFunction(LPVOID lpParam)//char *cPath, char *cBasePath)
{
int iTotal;
CString csMessage;
int i,iError=0;
char temp1[256],temp2[256],temp[256],*ptemp;
if(!bMUpThread)//非多线程模式
{
HINTERNET hInetSession;
HINTERNET hFtpConn;
bLinkDataGood=false;
bWebTry=false; //无需服务器重试
iTotal=pWorkView->m_WorkList.GetItemCount();
if(iTotal<=0)
{
if(bAutoLoad)
{
if(bAutoHangUp)
{
HangUp();
}
bAutoLoad=false;
}
//MyFtpUpThreadEnd();
return 0;
}
bWebTry=true; //允许服务器重试
hInetSession=InternetOpen("EasyFtp-UpData",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
csMessage="正在连接->";
csMessage+=csName;
csMessage+="服务器\r\n";
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
hFtpConn=InternetConnect(hInetSession,csName,21,
csUser,csPassword,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
if(!hFtpConn)
{
csMessage=csName;
csMessage+="服务器未接上\r\n";
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
InternetCloseHandle(hInetSession);
::Sleep(10);
//MyFtpUpThreadEnd();
return 0;
}
csMessage=csUser;
csMessage+="已经成功登录";
csMessage+=csName;
csMessage+="服务器\r\n";
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
bLinkDataGood=true;
::Sleep(1000);
for(i=0;i<iTotal;i++)
{
strcpy(temp1,csLocalPath);
strcat(temp1,"\\");
strcat(temp1,pWorkView->m_WorkList.GetItemText(i,3));
strcat(temp1,pWorkView->m_WorkList.GetItemText(i,0));
///AfxMessageBox(temp1);
strcpy(temp2,"/");
strcat(temp2,csWebPath);
if(strcmp(temp2,"/")==0)
{
}
else
{
strcat(temp2,"/");
}
strcat(temp2,pWorkView->m_WorkList.GetItemText(i,3));
strcat(temp2,pWorkView->m_WorkList.GetItemText(i,0));
for(unsigned int j=0;j<(strlen(temp2)+1);j++)
{
if(temp2[j]=='\\')
{
temp2[j]='/';
}
}
strcpy(temp,strlwr(temp1));
strcpy(temp1,temp);
//强制小写
strcpy(temp,strlwr(temp2));
strcpy(temp2,temp);
//强制小写
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"正在发送文件:");
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)temp1);
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"->");
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)temp2);
//AfxMessageBox(temp2);
putfileagain:
bLinkDataGood=true;
if(FtpPutFile(hFtpConn,temp1,temp2,INTERNET_FLAG_TRANSFER_BINARY ,0))
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"--OK\r\n");
pWorkView->m_WorkList.SetItemText(i,5,"完成");
}
else
{
if(GetLastError()==12003)//路径非法
{
strcpy(temp,temp2);
ptemp=strrchr(temp,'/');
if(ptemp)
{
temp[strlen(temp)-strlen(ptemp)]=0x00;
if(FtpCreateDirectory(hFtpConn,temp))
goto putfileagain;
//建立目录
}
}
else//不是目录问题
{ //失败重试
if((iError++)<iWebTryLoop)
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n重试 ");
goto putfileagain;
}
}
bLinkDataGood=false;
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"--失败\r\n");
pWorkView->m_WorkList.SetItemText(i,5,"失败");
}
}
bLinkDataGood=false;
InternetCloseHandle(hFtpConn);
////////////////////////////////
InternetCloseHandle(hInetSession);//关闭连接
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"连接已经关闭\r\n");
bWebTry=false;
iTotal=pWorkView->m_WorkList.GetItemCount();
if(bWebAgain&&iTotal>0)//错误重试
{
for(i=0;i<iTotal;i++)
{
strcpy(temp,pWorkView->m_WorkList.GetItemText(i,5));
if(strcmp("完成",temp)!=0)
{
bWebTry=true;
}
else//将完成的去掉
{
pWorkView->m_WorkList.DeleteItem(i);
iTotal-=1;
i-=1;
}
}
}
if(bWebTry)//需要重试
{
//MyFtpUpThreadEnd();
return 0;
}
bLinkDataGood=false;
if(bAutoHangUp)
{
HangUp();
}
bAutoLoad=false;
bWebTry=false; //无需服务器重试
// MyFtpUpThreadEnd();
return 1;
}//普通模式
else//多线程模式*******************!!!!!!!!!!!!!
{
iMThreadWorkTotal=pWorkView->m_WorkList.GetItemCount();
//得到工作任务个数
bLinkDataGood=false;
if(bAutoDial&&(iMThreadWorkTotal>0))
//如果是自动拨号模式且有任务
{
if(!Dial())//拨号失败循环
{
int i;
if(bAutoDialAgain)//失败重拨模式
{
for(i=0;i<iDialLoop;i++)
{
HangUp();
csMessage.Format("\r\n拨号失败,延迟%d秒后进行第%d次(共%d次)重试\r\n",iDialDelay,i+1,iDialLoop);
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
::Sleep(iDialDelay*1000);
if(Dial())
break;
if(bExitApp)
break;
}
if(i>=iDialLoop)//拨号已满
{
bAutoLoad=false;//关闭自动模式
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号失败");
return 0;//关闭退出线程
}
}
else
{
bAutoLoad=false;//关闭自动模式
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号失败");
return 0;//关闭退出线程
}
}//拨号成功
}//拨号处理完成
for(i=0;i<5;i++)
{
bMThreadWorkReady[i]=true;//初始化线程空闲
}
iMThreadWorkNowNo=0; //当前已经分配的任务号码
if(iMThreadWorkTotal<=0)//没有更多的任务
{
bLinkDataGood=false;
//完成任务后回填********************
pWebView->PostMessage(WM_MY_WEB_TOLOCAL,0,(LPARAM)-1);
//****************************
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n上传完成\r\n");
if(bAutoHangUp)//需要自动挂断
{
HangUp();
}
::Sleep(iDialDelay*1000);//等待回填工作
if(bShutDownWhenFinish)//完成后关闭计算机
{
pMainFrame->PostMessage(WM_MY_SHUTDOWN);
}
if(bQuitWhenFinish) //完成后退出
{
pMainFrame->PostMessage(WM_MY_APP_EXIT);
}
return 0;
}
//有任务需要完成
for(i=0;i<iMThreadMax;i++)
{
if(bMThreadWorkReady[i]&&(iMThreadWorkNowNo<iMThreadWorkTotal))
//有任务,且工作线程有空
{
bMThreadWorkReady[i]=false;//填写线程忙标志
//开始工作,并传递工作号码和线程号码(预留10个)
if((MyMUpThread[i] = AfxBeginThread(MyMUpThreadFunction,(LPVOID)((iMThreadWorkNowNo++)*10+i))) == NULL)
{
AfxMessageBox("线程失败处理");
//建立失败处理
return 0;
}
else //函数建立一个辅助线程并暂时将其挂起。
{
MyMUpThread[i]->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
MyMUpThread[i]->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
}
}
}
return 1;
}
}
void CMainFrame::OnCtlFtpup()
{
// TODO: Add your command handler code here
iWebTryLoop=0;
bExitApp=false;
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n准备上传\r\n");
if((MyFtpUpThread = AfxBeginThread(MyFtpUpThreadFunction,this)) == NULL)
{
//建立失败处理
return;
}
else //函数会建立一个辅助线程并暂时将其挂起。
{
MyFtpUpThread->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
MyFtpUpThread->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
}
}
void CMainFrame::OnCtlDial()
{
// TODO: Add your command handler code here
if((MyDialThread = AfxBeginThread(MyDialThreadFunction,0)) == NULL)
{
//建立失败处理
return ;
}
else //函数会建立一个辅助线程并暂时将其挂起。
{
MyDialThread->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
MyDialThread->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
}
}
bool Dial()
{
CString csMessage;
DWORD dwLength=MAX_PATH;
RASCONN ras[20];
DWORD dSize, dNumber;
char szBuf[256];
ras[0].dwSize = sizeof( RASCONN );
dSize = sizeof( ras ); // Get active RAS - Connection
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"诊测网络状态...");
DWORD dwRet = RasEnumConnections( ras, &dSize, &dNumber );
if ( dwRet != 0 )
{
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "挂断时发生未知的错误(%ld).", dwRet );
csMessage=szBuf;
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
return false;
}//列举在线的连接
if(dNumber==0)
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"不存在\r\n正在进行拨号连接...");
RASDIALPARAMS rdParams; //申明参数变量
rdParams.dwSize = sizeof(RASDIALPARAMS);
rdParams.szEntryName[0] = '\0';
lstrcpy( rdParams.szPhoneNumber, sDialNumber);//填写电话号码
rdParams.szCallbackNumber[0] = '\0';
lstrcpy( rdParams.szUserName, sDialUser);//填写用户名
lstrcpy( rdParams.szPassword, sDialPassword);//填写密码号码
rdParams.szDomain[0] = '\0';
HRASCONN hRasConn = NULL;
DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &hRasConn );
if ( dwRet == 0 )
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"建立拨号网络成功\r\n");
} //连接成功
else
{
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "连接时发生未知的错误(%ld).", dwRet );
RasHangUp( hRasConn );
//MessageBox( (LPSTR)szBuf, "错误", MB_OK | MB_ICONSTOP );
csMessage=szBuf;
csMessage+="\r\n";
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
return false;
}
}
else
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"已经存在\r\n");
return true;
}
return true;
}
bool HangUp()
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"准备挂断拨号连接");
//bExitApp=true;
//MyFtpLogoThreadEnd();
RASCONN ras[20];
DWORD dSize, dNumber,dwRet;
char szBuf[256];
ras[0].dwSize = sizeof( RASCONN );
dSize = sizeof( ras ); // Get active RAS - Connection
dwRet = RasEnumConnections( ras, &dSize, &dNumber );
if ( dwRet != 0 )
{
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "挂断时发生未知的错误(%ld).", dwRet );
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)szBuf);
return false;
}//列举在线的连接
if(dNumber==0)
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号连接不存在");
return false;
}
for( DWORD dCount = 0; dCount < dNumber; dCount++ )
{ // Hang up that connection
HRASCONN hRasConn = ras[dCount].hrasconn;
DWORD dwRet = RasHangUp( hRasConn );
if ( dwRet != 0 )
{
char szBuf[256];
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "挂断时发生未知的错误(%ld).", dwRet );
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)szBuf);
return false;
}
}//挂断所有连接
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号连接已经挂断");
return true;
}
void CMainFrame::OnCtlSetting()
{
// TODO: Add your command handler code here
CSettingBox setbox;
setbox.m_AutoDial=bAutoDial;
setbox.m_AutoHangUp=bAutoHangUp;
setbox.m_DialAgain=bAutoDialAgain;//拨号失败继续重拨
setbox.m_DialWhenHangUp=bDialWhenHangUp;//必要时候拨号
setbox.m_DialLoop=iDialLoop; //拨号失败次数
setbox.m_DialDelay=iDialDelay; //拨号失败延迟
setbox.m_WebAgain=bWebAgain; //服务器失败重试
setbox.m_WebLoop=iWebLoop; //服务器失败重试次数
setbox.m_MUpThread=bMUpThread; //允许多个上传线程
setbox.m_MThreadNo=iMThreadMax;//服务器线程最大值
setbox.m_WebToLocal=bWebToLocal; //直接记录比较
setbox.m_AutoQuit=bQuitWhenFinish;
setbox.m_AutoShutDown=bShutDownWhenFinish;
setbox.m_CmpTime=bCmpTime;
setbox.m_Number.Format("%s",sDialNumber);
setbox.m_User.Format("%s",sDialUser);
setbox.m_Passwrod.Format("%s",sDialPassword);
if(setbox.DoModal()==IDOK)
{
bAutoDial=setbox.m_AutoDial;
bAutoHangUp=setbox.m_AutoHangUp;
bCmpTime=setbox.m_CmpTime;
strcpy(sDialNumber,setbox.m_Number);
strcpy(sDialUser,setbox.m_User);
strcpy(sDialPassword,setbox.m_Passwrod);
bAutoDialAgain=setbox.m_DialAgain;//拨号失败继续重拨
bDialWhenHangUp=setbox.m_DialWhenHangUp;//必要时候拨号
iDialLoop=setbox.m_DialLoop; //拨号失败次数
iDialDelay=setbox.m_DialDelay; //拨号失败延迟
bWebAgain=setbox.m_WebAgain; //服务器失败重试
iWebLoop=setbox.m_WebLoop; //服务器失败重试次数
bMUpThread=setbox.m_MUpThread; //允许多个上传线程
iMThreadMax=setbox.m_MThreadNo;//服务器线程最大值
bWebToLocal=setbox.m_WebToLocal; //直接记录比较
bQuitWhenFinish=setbox.m_AutoQuit;
bShutDownWhenFinish=setbox.m_AutoShutDown;
}
}
void CMainFrame::OnCtlAutoload()
{
// TODO: Add your command handler code here
iWebTryLoop=0;
bAutoLoad=true;
bCmpNow=false;
pLocalView->PostMessage(WM_MY_PROJECT_PATH,0,(LPARAM)sProjectAttrib[iNowProjectNo][5]);
//OnButton1();
}
void CMainFrame::OnAutoLoad(WPARAM wParam, LPARAM lParam)
{
bExitApp=false;
OnCtlFtpup();
}
void CMainFrame::OnAutoLink(WPARAM wParam, LPARAM lParam)
{
OnButton1();
}
void CMainFrame::OnCtlCmp()
{
// TODO: Add your command handler code here
bAutoLoad=false;
bCmpNow=true;
pLocalView->PostMessage(WM_MY_PROJECT_PATH,0,(LPARAM)sProjectAttrib[iNowProjectNo][5]);
}
UINT MyDialThreadFunction(LPVOID lpParam)
{
CString csMessage;
int i;
if((!Dial())&&bAutoDialAgain)
{
for(i=0;i<iDialLoop;i++)
{
HangUp();
csMessage.Format("\r\n拨号失败,延迟%d秒后进行第%d次(共%d次)重试\r\n",iDialDelay,i+1,iDialLoop);
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
::Sleep(iDialDelay*1000);
if(Dial())
break;
if(bExitApp)
break;
}
if(i>=iDialLoop)
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n拨号失败\r\n");
else//拨号成功
{
if(bAutoLoad)
{
pMainFrame->PostMessage(WM_MY_WEBLOOP_LOGO);
}
}
}
return 0;//关闭退出线程
}
void CMainFrame::OnProjectAdd()
{
// TODO: Add your command handler code here
CProjectName NameBox;
NameBox.m_Name.Format("新建项目编号%02d",iTotalProject+1);
NameBox.m_WebAdd="ftp.your.com";
NameBox.m_WebPath="";
NameBox.m_User="webmastername";
NameBox.m_Passwrod="12345678";
NameBox.m_LocalPath="c:\\temp";
if(NameBox.DoModal()==IDOK)
{
iNowProjectNo=iTotalProject++;
strcpy(sProjectAttrib[iNowProjectNo][0],NameBox.m_Name);
strcpy(sProjectAttrib[iNowProjectNo][1],NameBox.m_User);
strcpy(sProjectAttrib[iNowProjectNo][2],NameBox.m_WebAdd);
strcpy(sProjectAttrib[iNowProjectNo][3],NameBox.m_Passwrod);
strcpy(sProjectAttrib[iNowProjectNo][4],NameBox.m_WebPath);
strcpy(sProjectAttrib[iNowProjectNo][5],NameBox.m_LocalPath);
// m_wndDlgBar.SetDlgItemText(IDC_FTPADD,sProjectAttrib[iNowProjectNo][2]);
// m_wndDlgBar.SetDlgItemText(IDC_FTPUSER,sProjectAttrib[iNowProjectNo][1]);
// m_wndDlgBar.SetDlgItemText(IDC_FTPPASSWORD,sProjectAttrib[iNowProjectNo][3]);
// m_wndDlgBar.SetDlgItemText(IDC_WEBPATH,sProjectAttrib[iNowProjectNo][4]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -