1. 程式人生 > >應用程序實現對其他應用程式的呼叫

應用程序實現對其他應用程式的呼叫

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                在 我 們 設 計 的 應 用 程 序 中, 很 可 能 會 用 到 其 他 應 用 程 序 來 完 成 某 一 特 定 功 能。 例 如, 當 我 們 為 了 便 於 數 據 的 傳 輸 而 對 諸 多 文 件 進 行 壓 縮 和 解 壓 縮 時, 一 種 作 法 是 我 們 自 己 設 計 一 個 這 樣 的 壓 縮/ 解 壓 縮 程 序, 然 後 以 動 態 鏈 接 庫(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 dir  SetCurrentDirectory(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"; 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();  }}
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述