使用 Http 在线自动升级程序
2006-07-21 11:14:54 来源:WEB开发网先通过 CUpdateDlg::FindAppProcessID() 看要更新的程序是否在运行:DWORD CUpdateDlg::FindAppProcessID()
该函数返回程序进程号,如果要更新的程序正在运行的话,提示人工退出否则用TerminateProcess 杀掉进程!下载的文件大小用:
{
HANDLE handle=::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
PROCESSENTRY32 Info;
Info.dwSize = sizeof(PROCESSENTRY32);
if(::Process32First(handle,&Info))
{
do{
CString ss=Info.szExeFile;
if(!ss.CompareNoCase(m_strSoft+".exe"))
{
::CloseHandle(handle);
return Info.th32ProcessID;
}
}
while(::Process32Next(handle,&Info));
::CloseHandle(handle);
}
return -1;
} pFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,str);
取得。为防止下载一半网络出现故障,先将下载的文件加后缀名.upg,下载全部成功后替换掉原来在用的程序,完成更新。
关键代码部分如下:...
有关其它细节请参考源代码。
CStdioFile csf;
if( !csf.Open( str+".upg",
CFile::modeCreate
| CFile::modeWrite
| CFile::typeBinary
| CFile::shareDenyWrite ) )
{//先为*.upg文件
AfxMessageBox("写文件"+str +"错误!\n文件正在使用中,请先关闭程序!",
MB_ICONSTOP);
pFile->Close();
return FALSE;
}
char buf[2048];
DWORD dwRead=0;
while((n=pFile->Read(buf,sizeof(buf)))>0)
{
dwRead+=n;
m_prog.SetPos(100*dwRead/dwLen);
MSG msg;
for(int i=0;i<10;i++)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
csf.Write(buf,n);
}
pFile->Close();
...
if(::DeleteFile(str)){
::rename(str+".upg",str);
m_strStatus=strFile+"完成更新!";
UpdateData(FALSE);
...
更多精彩
赞助商链接