文章原址:http://hi.baidu.com/%C0%D6%B5%C4%E3%B0%E2%EA/blog/item/287895f1a6f80b3dbc310910.html
在開發MFC應用程式的時候,如果要實現一個特定的功能,當然一般的做法就是添加一個處理這個功能的對話方塊,給對話方塊加上類,需要調用功能的時候就直接把對話方塊掉出來就行了。但是,如果那個功能在一個外部exe實現,而有沒有那個exe檔案的實現代碼,怎麼辦?直接調用外部的那個exe檔案就行了。。
方法一、(進程方式)
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi,sizeof(pi));
if(!CreateProcess(NULL, "E;\Test.exe ",NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi))
{
MessageBox( "出錯 ", "提示 ",MB_OK|MB_ICONINFORMATION);
}
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
方法二、(線程方式)
WinExec( "Test.Exe ",SW_HIDE);
Q: 如何開啟一個應用程式?
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
或
ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );
As you can see, I haven't passed the full path of the programs.
Q: 如何開啟一個同系統程式相關連的文檔?
ShellExecute(this->m_hWnd,"open",
"c:\\abc.txt","","",SW_SHOW );
Q: 如何開啟一個網頁?
ShellExecute(this->m_hWnd,"open",
"http://hi.baidu.com/%C0%D6%B5%C4%E3%B0%E2%EA/home","","", SW_SHOW );
Q: 如何啟用相關程式,發送EMAIL?
ShellExecute(this->m_hWnd,"open",
"mailto:gongziya@gmail.com","","", SW_SHOW );
Q: 如何用系統印表機列印文檔?
ShellExecute(this->m_hWnd,"print",
"c:\\abc.txt","","", SW_HIDE);
Q: 如何用系統尋找功能來尋找指定檔案?
ShellExecute(m_hWnd,"find","d:\\nish",
NULL,NULL,SW_SHOW);
******************************************************************************
上面的兩種方法是我貼的網易部落格《MFC 調用EXE》
******************************************************************************
現在寫一個test.exe作為測試,原始碼:
#include<iostream>
using namespace std;
int main()
{
cout<<"\nHello World"<<endl;
return 0;
}
測試程式:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
WinExec( "test.Exe ", SW_HIDE);
return 0;
}
會發現調用確實起到了效果。現在有一個EXE遊戲BOX.exe(推箱子遊戲),放在E盤的BOX檔案夾下。然後建立MFC基於對話方塊應用程式,雙擊確定按鈕,進入訊息處理函數OnOK,編輯代碼如下:
void CCREATE_PROCESS_DEMODlg::OnOK()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if(!CreateProcess(TEXT("E:\\BOX\\BOX.exe"), NULL, NULL, NULL,FALSE,0, NULL, NULL, &si, &pi))
{
MessageBox("沒有找到","Title",MB_OK);
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
::MessageBox(NULL,"回到了主程式","正常返回",MB_OK);
CDialog::OnOK();
}
開啟外部得exe程式,退出後又回到了主程式繼續執行。