请大家讨论一下程序更新自身的问题。 我用批处理文件,但有一局限性,就是如果路径中有空格,就无效了。 请大虾支招,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BOOL SelfDelete(){ TCHAR szModule [MAX_PATH], szComspec[MAX_PATH], szParams [MAX_PATH]; // get file path names: if((GetModuleFileName(0,szModule,MAX_PATH)!=0) && (GetShortPathName(szModule,szModule,MAX_PATH)!=0) && (GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0)) { // set command shell parameters lstrcpy(szParams," /c del "); lstrcat(szParams, szModule); lstrcat(szParams, " > nul"); lstrcat(szComspec, szParams); // set struct members STARTUPINFO si={0}; PROCESS_INFORMATION pi={0}; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; // increase resource allocation to program SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); // invoke command shell if(CreateProcess(0, szComspec, 0, 0, 0,CREATE_SUSPENDED| DETACHED_PROCESS, 0, 0, &si, &pi)) { // suppress command shell process until program exits SetPriorityClass(pi.hProcess,IDLE_PRIORITY_CLASS); SetThreadPriority(pi.hThread,THREAD_PRIORITY_IDLE); // resume shell process with new low priority ResumeThread(pi.hThread); // everything seemed to work return TRUE; } else // if error, normalize allocation { SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); } } return FALSE;}大家看看上面这段代码有效否?谢谢! "如果路径中有空格,就无效了"加引号就okc:\"program files"\myprogram\ 楼上的,是不是应该这样?"c:\program files\myprogram\xxx.exe" -xxx -sss 如果你使用批处理方式,那么注定你要走弯路。方法如下(注意要复制的文件不能超过8.3的长度否则不成功)读一下有关MoveFileEx的MSDN:void CDlgUpdate::WriteRegForCopyFile(){ char szNewFullPath[MAX_PATH + 1]; char pWininitFile[ MAX_PATH ]; memset(pWininitFile,0,MAX_PATH); GetWindowsDirectory( pWininitFile, MAX_PATH); strcat(pWininitFile,"\\wininit.ini"); OSVERSIONINFO VersionInformation; VersionInformation.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx( &VersionInformation ); for ( int i = 0; i < g_XMLFileCompare.m_arrDownload.GetSize(); i++ ) { GetSystemDirectory(szNewFullPath, MAX_PATH ); strcat( szNewFullPath, "\\" + g_XMLFileCompare.m_arrDownload.GetAt(i).m_strFileName ); CString strExistFullPath = AfxGetAppHomeDir() + "update\\" + g_XMLFileCompare.m_arrDownload.GetAt(i).m_strFileName; if( VER_PLATFORM_WIN32_NT == VersionInformation.dwPlatformId ) { MoveFileEx( strExistFullPath, szNewFullPath, MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING); } else { WritePrivateProfileString( "rename", szNewFullPath, strExistFullPath, pWininitFile ); } } CString strExistFullPath = AfxGetAppHomeDir() + "update\\success.txt"; if( VER_PLATFORM_WIN32_NT == VersionInformation.dwPlatformId ) { MoveFileEx( strExistFullPath, NULL, MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING); } else { WritePrivateProfileString( "rename", "NUL", strExistFullPath, pWininitFile ); }} 苯方法,但比较有效有rar压缩成可自解压的exe文件不就行了 vs2010两个程序使用ODBC操作同一个SQLSERVER数据库遇到的问题 VC++ 6.0不能启动工具.Error spawning 'vcspawn.exe'. The build could not be performed. 麻烦高手帮忙看一下这个程序,给点意见 路径有问题么?还是有别的原因? 新手初次接触:动态生成IE浏览器控件的问题 关于实时监控系统数据库的问题(在这方面比较了解的请进) 怎样将web浏览器控件嵌入到单文档视图里面(不是对话框)? 怎样实现从串口传输数据? 请教水纹算法? 有什么好的文本文件加密方法? 如何通过网络的域名获得IP地址 1
{
TCHAR szModule [MAX_PATH],
szComspec[MAX_PATH],
szParams [MAX_PATH]; // get file path names:
if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&
(GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&
(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))
{
// set command shell parameters
lstrcpy(szParams," /c del ");
lstrcat(szParams, szModule);
lstrcat(szParams, " > nul");
lstrcat(szComspec, szParams);
// set struct members
STARTUPINFO si={0};
PROCESS_INFORMATION pi={0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; // increase resource allocation to program
SetPriorityClass(GetCurrentProcess(),
REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),
THREAD_PRIORITY_TIME_CRITICAL); // invoke command shell
if(CreateProcess(0, szComspec, 0, 0, 0,CREATE_SUSPENDED|
DETACHED_PROCESS, 0, 0, &si, &pi))
{
// suppress command shell process until program exits
SetPriorityClass(pi.hProcess,IDLE_PRIORITY_CLASS);
SetThreadPriority(pi.hThread,THREAD_PRIORITY_IDLE); // resume shell process with new low priority
ResumeThread(pi.hThread); // everything seemed to work
return TRUE;
}
else // if error, normalize allocation
{
SetPriorityClass(GetCurrentProcess(),
NORMAL_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),
THREAD_PRIORITY_NORMAL);
}
}
return FALSE;
}
大家看看上面这段代码有效否?谢谢!
加引号就ok
c:\"program files"\myprogram\
"c:\program files\myprogram\xxx.exe" -xxx -sss
方法如下(注意要复制的文件不能超过8.3的长度否则不成功)读一下有关MoveFileEx的MSDN:
void CDlgUpdate::WriteRegForCopyFile()
{
char szNewFullPath[MAX_PATH + 1];
char pWininitFile[ MAX_PATH ];
memset(pWininitFile,0,MAX_PATH);
GetWindowsDirectory( pWininitFile, MAX_PATH);
strcat(pWininitFile,"\\wininit.ini");
OSVERSIONINFO VersionInformation;
VersionInformation.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx( &VersionInformation ); for ( int i = 0; i < g_XMLFileCompare.m_arrDownload.GetSize(); i++ )
{
GetSystemDirectory(szNewFullPath, MAX_PATH );
strcat( szNewFullPath, "\\" + g_XMLFileCompare.m_arrDownload.GetAt(i).m_strFileName );
CString strExistFullPath = AfxGetAppHomeDir() + "update\\" + g_XMLFileCompare.m_arrDownload.GetAt(i).m_strFileName;
if( VER_PLATFORM_WIN32_NT == VersionInformation.dwPlatformId )
{
MoveFileEx( strExistFullPath, szNewFullPath, MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING);
}
else
{
WritePrivateProfileString( "rename", szNewFullPath, strExistFullPath, pWininitFile );
}
} CString strExistFullPath = AfxGetAppHomeDir() + "update\\success.txt";
if( VER_PLATFORM_WIN32_NT == VersionInformation.dwPlatformId )
{
MoveFileEx( strExistFullPath, NULL, MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING);
}
else
{
WritePrivateProfileString( "rename", "NUL", strExistFullPath, pWininitFile );
}
}