应用进程实现对其他应用程序的调用

来源:互联网 发布:域名重定向怎么设置 编辑:程序博客网 时间:2024/06/06 06:51
在 我 们 设 计 的 应 用 程 序 中, 很 可 能 会 用 到 其 他 应 用 程 序 来 完 成 某 一 特 定 功 能。 例 如, 当 我 们 为 了 便 于 数 据 的 传 输 而 对 诸 多 文 件 进 行 压 缩 和 解 压 缩 时, 一 种 作 法 是 我 们 自 己 设 计 一 个 这 样 的 压 缩/ 解 压 缩 程 序, 然 后 以 动 态 链 接 库(DLL) 或 者 函 数 库 的 形 式 由 主 应 用 程 序 调 用。 但 更 方 便 而 且 高 效 的 作 法 是 利 用 现 有 的 这 方 面 的 优 秀 软 件, 比 如ARJ.EXE, 并 以 进 程 的 形 式 调 用 它, 再 在 适 当 时 候 关 闭 它。 下 面 将 以 上 面 所 述 为 例, 具 体 介 绍 后 一 种 方 法 的 实 现 过 程。
  • 在 需 要 调 用ARJ.EXE 进 行 压 缩/ 解 压 缩 的 类 中, 创 建 一 个 成 员 函 数, 不 妨 称 作CreateBat(), 其 作 用 是 生 成 一 个 批 处 理 文 件。 由 该 批 处 理 文 件 调 用ARJ.EXE, 并 给 出 具 体 压 缩/ 解 压 缩 参 数。 之 后, 再 利 用MS-DOS 的DIR 命 令 生 成 一 个 临 时 文 件, 以 作 为 压 缩/ 解 压 缩 工 作 完 成 的 标 志。
void CMyCompress:: CreateBat(CString BatPath,CString ArjPath,                  CString BatName,CString ArjFileName,                  CString TempPath,CString ExitFlag,BOOL out){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 dirSetCurrentDirectory(BatPath);CStdioFile f;CFileException e;if (!f.Open( BatName, CFile::modeCreate|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";elsestring=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 dirSetCurrentDirectory(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 defaultCFile file;CFileException Error;if (file.Open(ExitFlag,CFile::modeRead,&Error)) {Search=FALSE;file.Close();}}
原创粉丝点击