首页/技术开发/内容

完成设置过程提示对话框

技术开发2024-06-06 阅读()
CFile::modeWrite, &e))
//以BatName的内容创建一个批处理文件
{
AfxMessageBox("不能创建文件"+BatName);
return ;
}
char density[6];
sprintf(density,"%d",mTotalBytes);
---- //mTotalBytes 是由其他函数设定的变量,用于记录用于拷入或拷出文件
的磁盘所具有的最大可用空间
CString Density=density;
CString string;
if (out)//说明是生成做压缩工作的批处理文件
string="arj a -v"+Density;
else //说明是生成做解压缩工作的批处理文件
string="arj e -v"+Density;

string+=" ..\\"+ArjPath+"\\"+ArjFileName+" ";
if (out)
string=string+"..\\"+TempPath+"\\*.* -y -jm\n";
else
string=string+"..\\"+TempPath+"\\ -y -jm\n";

f.WriteString(string);
string="dir >"+ExitFlag+"\n";
f.WriteString(string);
f.Close();
SetCurrentDirectory(lpBuffer);//回复到原来的目录下
}
---- 该函数执行后,将生成一个批处理文件,内容大致是:
---- ARJ A -V1440 压缩后文件的路径名+ 文件名被压缩文件的路径名+ 文件名
-Y -JM
---- DIR > 临时文件名
---- 或者是:
---- ARJ E -V1440 被解压缩文件的路径名+ 文件名解压缩后文件的路径名+ 文
件名-Y -JM
---- DIR > 临时文件名
在需要调用ARJ.EXE 进行压缩/ 解压缩的类中,再创建一个成员函数,不妨称
作RunBat(),其作用是创建和执行进程来运行上述所生成的批处理文件,并
在适当时候撤消进程。
void CMyCompress::RunBat(CString
BatPath,CString fileName,CString ExitFlag)
{
CString lpApplicationName=BatPath+"\\"+fileName;
// 进程执行的应用程序的完全路径名
STARTUPINFO StartupInfo;// 创建进程所需的信息结构变量
GetStartupInfo(&StartupInfo);
StartupInfo.lpReserved=NULL;
StartupInfo.lpDesktop=NULL;
StartupInfo.lpTitle=NULL;
StartupInfo.dwX=0;
StartupInfo.dwY=0;
StartupInfo.dwXSize=200;
StartupInfo.dwYSize=300;
StartupInfo.dwXCountChars=500;
StartupInfo.dwYCountChars=500;
StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_HIDE;
// 说明进程将以隐藏的方式在后台执行
StartupInfo.cbReserved2=0;
StartupInfo.lpReserved2=NULL;
StartupInfo.hStdInput=stdin;
StartupInfo.hStdOutput=stdout;
StartupInfo.hStdError=stderr;
LPTSTR lpBuffer;
UINT uSize;
HANDLE hHeap;

uSize=(GetCurrentDirectory(0,NULL))*sizeof(TCHAR);
hHeap=GetProcessHeap();
lpBuffer=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,uSize);

GetCurrentDirectory(uSize,lpBuffer);
// 得知当前目录信息,以便根据需要变换目录
if (lpBuffer!=BatPath) //diferent dir
SetCurrentDirectory(BatPath);
// 创建进程
if (CreateProcess(lpApplicationName,NULL,NULL,
NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,
NULL,NULL,&StartupInfo,&pro_info))
{
MSG Message;
DeleteFile(ExitFlag);
SetTimer(1,100,NULL);// 设置计时器
Search=TRUE;
while(Search) {
if (::PeekMessage(&Message,NULL,0,0,PM_REMOVE)) {
::TranslateMessage(&Message);
::DispatchMessage(&Message);
}
}
// 进程结束前后的处理工作
DWORDExitCode;
if (!GetExitCodeProcess(pro_info.hProcess,&ExitCode))
AfxMessageBox("GetExitCodeProcess is Failed!");
if (!TerminateProcess(pro_info.hProcess,(UINT)ExitCode))
// 终止进程
AfxMessageBox("TerminateProcess is Failed!");
if (!CloseHandle(pro_info.hProcess))
// 释放被终止进程的句柄
AfxMessageBox("CloseHandle is Failed!");
KillTimer(1);// 撤消计时器
}
else AfxMessageBox("Process Is Not Created!");
SetCurrentDirectory(lpBuffer);// 回复到原来的目录下
}
同时按下Ctrl 和W 键或直接单击工具条上的ClassWizard 按钮,打
开ClassWizard 对话框。在类名(Class name) 列表框中选择需要调用ARJ.EXE
进行压缩/ 解压缩的类,在Object IDs 列表框中选择该类的类名后,在消
息(Messages) 列表框中选择WM_TIMER 消息并双击它,这时ClassWizard 就会
在该类中加入一个OnTimer() 函数。该函数将以一定的时间间隔检查压缩/ 解
压缩程序是否已经执行完毕,即检查作为标志的临时文件是否已经存在,并
及时修改状态变量“Search”,以便通知RunBat() 函数结束进程。
void CMyCompress::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CFile file;
CFileException Error;
if (file.Open(ExitFlag,CFile::modeRead,&Error)) {
Search=FALSE;
file.Close();
}
}
自编删除目录及其下属文件的函数
---- 高版本的MS-DOS 和Windows 95 都提供了一个可以删除一个或多个目录及其
下属文件和目录的命令,即DeleteTree 命令。然而,无论在MFC 类库还是在Win32 函
数库中,都没有相应的函数与之对应。这样,当我们在自己设计的应用程序中需要
用到DeleteTree 的功能时,自然想到的方法是通过进程调用或者系统调用的方
式( 正如上面部分所述的那样) 调用MD-DOS 或Windows 95 下的DeleteTree 命令。然
而,Win32 函数库已经为我们提供了多种用于文件和目录操作的函数,利用它们不
难设计出自己的DeleteTree() 函数。
---- 读者读到这里,也许会感到有些疑惑,为什么第六部分强调进程调用优于自
我设计的函数,而这一部分又反了过来?是的,在通常情况下,调用应用程序内部
的函数比使用进程或者调用外部函数更灵活并且可以提高执行效率,也便于修
改。所以,象DeleteTree() 这样的功能,利用现有的函数并不难实现,自然就最好
通过内部函数的方式来完成。然而,象设计一个压缩/ 解压缩这样的函数的工作
量,并不比通过进程调用来使用现成品的开销更合算,因为它至少需要我们了解
压缩/ 解压缩的复杂算法,而且调试和维护它也需要一定代价。于是,这个时候,还
是采用“拿来主义”为好。
---- 下面,给出我自己设计的DeleteTree() 函数,仅供参考。
BOOL DeleteTree(CString DirName)
{ //成功:返回TRUE;否则,返回FALSE
BOOL Result;
Result=PreRemoveDirectory(DirName)
&& RemoveDirectory(DirName);
return Result;
}
BOOL PreRemoveDirectory(CString DirName)
{//成功:返回TRUE;否则,返回FALSE
LPTSTR lpBuffer;
UINT uSize;
CString fileName;
HANDLE hHeap;
BOOL result;
HANDLE hFindFile;
WIN32_FIND_DATA FindFileData;
uSize=(GetCurrentDirectory(0,NULL))*sizeof(TCHAR);
hHeap=GetProcessHeap();
lpBuffer=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,uSize);
GetCurrentDirectory(uSize,lpBuffer);
if (lpBuffer!=DirName) {//调整当前目录
SetCurrentDirectory(DirName);
}
hFindFile=FindFirstFile("*.*",&FindFileData);
CString tFile;
if (hFindFile!=INVALID_HANDLE_VALUE) {
do {
tFile=FindFileData.cFileName;
if ((tFile==".")(北联网教程,专业提供视频软件下载)

第1页  第2页  第3页  第4页  第5页  第6页  第7页  第8页  第9页  第10页 

……

相关阅读