目前知道三種方式:WinExec,ShellExecute ,CreateProcess,別人已經總結的很好了《vc中調用其他應用程序的方法(函數) winexec,shellexecute ,createprocess》,我全文轉載一下,另外后面加點自己的總結(黑體部分,除了標題)。 三個SDK函數: WinExec,ShellExecute ,CreateProcess可以實現調用其他程序的要求,其中以WinExec最為簡單,ShellExecute比WinExec靈活一些,CreateProcess最為復雜。 WinExec 兩個參數,前一個指定路徑,后一個指定顯示方式。 ShellExecute 可以指定工作目錄,並且還可以尋找文件的關聯直接打開不用加載與文件關聯的應用程序,ShellExecute還可以打開網頁,啟動相應的郵件關聯發送郵件等等。 CreateProcess 一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承信息,類的優先級等等。如果我們要得到足夠多的關於新的進程的信息,控制新的進程的細節屬性,若要達到這些目的,我們就需要使用CreateProcess函數了。 三個SDK函數( WinExec、ShellExec、CrateProcess )的語法: (一)WinExec 這個函數最簡單,只有兩個參數,原型如下: UINT WinExec( LPCSTR lpCmdLine, // 命令路徑 UINT uCmdShow // 顯示方式 ); 使用方法如下: WinExec("Notepad.exe", SW_SHOW); // 打開記事本 WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打開Test.exe 需要注意的是若用 SW_SHOWMAXMIZED 方式去加載一個無最大化按鈕的程序,譬如Neterm,Calc 等等,就不會出現正常的 窗體,但是已經被加到任務列表里了。 這個函數只能打開exe文件。 需要的頭文件:windows.h,winbase.h(前者是試驗出來,后者是msdn上說明),另外,這兩者的先后順序不能變。 msdn上的說明:[url]http://msdn.microsoft.com/en-us/library/ms687 393[/url](VS.85).aspx (二)ShellExecute 原型如下: HINSTANCE ShellExecute( HWND hwnd, //父窗口句柄 LPCTSTR lpOperation, //操作, 打開方式 "edit","explore","open","find","print","NULL" LPCTSTR lpFile, //文件名,前面可加路徑 LPCTSTR lpParameters, //參數 LPCTSTR lpDirectory, //默認文件夾 INT nShowCmd //顯示方式 ); 使用方法如下: ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL); // 打開C:\Test.txt 文件 ShellExecute(NULL, "open", "http://www.google.com/", NULL, NULL, SW_SHOWNORMAL); // 打開網頁www.google.com ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 打開目錄D:\C++ ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL , SW_HIDE); // 打印文件C:\Test.txt ShellExecute不支持定向輸出。 這個函數可以打開任意文件,會調用系統注冊的程序來打開對應后綴名的文件。 需要的頭文件:windows.h,shellapi.h(前者是我試驗出來的,后者是msdn說需要的)。另外這兩者的先后順序不能變。 msdn上說明:[url]http://msdn.microsoft.com/en-us/library/bb762 153[/url](VS.85).aspx (三)CreateProcess 原型如下: BOOL CreateProcess( LPCTSTR lpApplicationName, //執行程序名 LPTSTR lpCommandLine, // 參數行 //下面兩個參數描述了所創建的進程和線程的安全屬性,如果為NULL則使用默認的安全屬性 LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes BOOL bInheritHandles, // 繼承標志 DWORD dwCreationFlags, // 創建標志 LPVOID lpEnvironment, // 環境變量 LPCTSTR lpCurrentDirectory, // 運行該進程的初始目錄 LPSTARTUPINFO lpStartupInfo, // 用於在創建子進程時設置各種屬性 LPPROCESS_INFORMATION lpProcessInformation //用於在進程創建后接受相關信息 ); 使用方法如下: PROCESS_INFORMATION pi; STARTUPINFO si; memset(&si,0,sizeof(si)); si.cb=sizeof(si); si.wShowWindow=SW_SHOW; si.dwFlags=STARTF_USESHOWWINDOW; bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi); 這個函數可以打開任意文件,會調用系統注冊的程序來打開對應后綴名的文件。 需要的頭文件:windows.h,winbase.h(前者是試驗出來,后者是msdn上說明),另外,這兩者的先后順序不能變。 msdn上的說明:[url]http://msdn.microsoft.com/en-us/library/ms682 425[/url](VS.85).aspx 可以看出,通過上面的幾個不同的方法,都可以實現在應用程序中打開其他應用程序的目的,其中有些方法可能會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的! 關於三個SDK函數: WinExec, ShellExecute,CreateProcess 的其他注意事項: 1、定義頭文件 原作者的內容刪去。 這個是引用新函數都必須注意的內容。但是MS的頭文件引用順序有點怪,比如上面的三種清理。另外,如果用了預編譯,那么記得在任何源程序中的#include "stdafx.h"之前的引用都會失效,從其后才生效。(不可否認,預編譯有他的好處,尤其當程序很大的時候,但是任何好處都是要付出代價的) 2、定義路徑 C++中所表示的路徑要用 " \\ "而不是平常所用的" \ ",所以以上三個函數表示路徑都為: Disk:\\Directory\\...\\File name WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL); bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi) 3、注意文件的路徑 在程序a調用程序b的時候,b原來的默認的當前路徑都會變成a的當前路徑。所以,一定要注意。 可以養成使用絕對路徑的習慣,另外,記得打開文件之類的操作,一定要驗證是否有錯。 VC++6.0 Win95 如何在VC++中調用外部的DOS程序?它的函數是什么?如果用API,它的函數是什么? 回答: 你可以使用Windows API函數WinExec、ShellExecute。這兩個函數可以調用Windows和DOS程序。WinExec主要運行EXE文件。如: WinExec("Notepad.exe Readme.txt", SW_SHOW); ShellExecute不僅可以運行EXE文件,也可以運行已經關聯的文件。如: ShellExecute(0, "open", "http://askpro.yeah.net", NULL, NULL, 0); 另外,參考QA000583 "外調一個DOS程序,但是又不想顯示其產生的窗口"。 Vc 5.0 Windows 95 我正在編寫一個程序,想外調一個現成的Com,但是又不想顯示其產生的窗口,我試過可以關閉該窗口,一樣能運行,可是在我的程序中如何獲取該窗口句柄,如何自動關閉它?(飛飛) 其實使用ShellExecute調用DOS程序時可以不顯示窗口,如: ShellExecute(0, "open", "c:\\tools\\arj.exe", "a c:\\p.arj c:\\*.bat c:\\*.sys", NULL, SW_HIDE); 對於你的問題,你可以使用FindWindow獲得句柄,但關掉窗口就不能再繼續執行了。而你說的關閉窗口還能執行,大概是因為在你關閉窗口時已經運行結束了。 #include "stdafx.h" #include #include //ShellExecute 要引用的庫 int main(int argc, _TCHAR* argv[]) { ShellExecute(NULL,NULL,_T("E:\\Projekt1.exe"),NULL ,NULL,SW_SHOW); getchar(); return 0; } #include "stdafx.h" #include #include #include DWORD WINAPI ThreadWork(LPVOID num) { printf("%d\n",num); return 0; } int _tmain(int argc, _TCHAR* argv[]) { DWORD dwThreadID[5]; HANDLE threadhandle=CreateThread(NULL, 0, ThreadWork, (LPVOID)2,//傳遞的參數 0, &dwThreadID[0]); getchar(); return 0; }
http://blog.csdn.net/samdy1990/article/details/16919969
目前知道三種方式:WinExec,ShellExecute ,CreateProcess,別人已經總結的很好了《vc中調用其他應用程序的方法(函數) winexec,shellexecute ,createprocess》,我全文轉載一下,另外后面加點自己的總結(黑體部分,除了標題)。
三個SDK函數: WinExec,ShellExecute ,CreateProcess可以實現調用其他程序的要求,其中以WinExec最為簡單,ShellExecute比WinExec靈活一些,CreateProcess最為復雜。
WinExec 兩個參數,前一個指定路徑,后一個指定顯示方式。
ShellExecute 可以指定工作目錄,並且還可以尋找文件的關聯直接打開不用加載與文件關聯的應用程序,ShellExecute還可以打開網頁,啟動相應的郵件關聯發送郵件等等。
CreateProcess 一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承信息,類的優先級等等。如果我們要得到足夠多的關於新的進程的信息,控制新的進程的細節屬性,若要達到這些目的,我們就需要使用CreateProcess函數了。
三個SDK函數( WinExec、ShellExec、CrateProcess )的語法:
(一)WinExec
這個函數最簡單,只有兩個參數,原型如下:
UINT WinExec(
LPCSTR lpCmdLine, // 命令路徑
UINT uCmdShow // 顯示方式
);
使用方法如下:
WinExec("Notepad.exe", SW_SHOW); // 打開記事本
WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打開Test.exe
需要注意的是若用 SW_SHOWMAXMIZED 方式去加載一個無最大化按鈕的程序,譬如Neterm,Calc 等等,就不會出現正常的 窗體,但是已經被加到任務列表里了。
這個函數只能打開exe文件。
需要的頭文件:windows.h,winbase.h(前者是試驗出來,后者是msdn上說明),另外,這兩者的先后順序不能變。
msdn上的說明:[url]http://msdn.microsoft.com/en-us/library/ms687 393[/url](VS.85).aspx
(二)ShellExecute
原型如下:
HINSTANCE ShellExecute(
HWND hwnd, //父窗口句柄
LPCTSTR lpOperation, //操作, 打開方式 "edit","explore","open","find","print","NULL"
LPCTSTR lpFile, //文件名,前面可加路徑
LPCTSTR lpParameters, //參數
LPCTSTR lpDirectory, //默認文件夾
INT nShowCmd //顯示方式
);
使用方法如下:
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL); // 打開C:\Test.txt 文件
ShellExecute(NULL, "open", "http://www.google.com/", NULL, NULL, SW_SHOWNORMAL); // 打開網頁www.google.com
ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 打開目錄D:\C++
ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL , SW_HIDE); // 打印文件C:\Test.txt
ShellExecute不支持定向輸出。
這個函數可以打開任意文件,會調用系統注冊的程序來打開對應后綴名的文件。
需要的頭文件:windows.h,shellapi.h(前者是我試驗出來的,后者是msdn說需要的)。另外這兩者的先后順序不能變。
msdn上說明:[url]http://msdn.microsoft.com/en-us/library/bb762 153[/url](VS.85).aspx
(三)CreateProcess
原型如下:
BOOL CreateProcess(
LPCTSTR lpApplicationName, //執行程序名
LPTSTR lpCommandLine, // 參數行
//下面兩個參數描述了所創建的進程和線程的安全屬性,如果為NULL則使用默認的安全屬性
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // 繼承標志
DWORD dwCreationFlags, // 創建標志
LPVOID lpEnvironment, // 環境變量
LPCTSTR lpCurrentDirectory, // 運行該進程的初始目錄
LPSTARTUPINFO lpStartupInfo, // 用於在創建子進程時設置各種屬性
LPPROCESS_INFORMATION lpProcessInformation //用於在進程創建后接受相關信息
);
使用方法如下:
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi);
這個函數可以打開任意文件,會調用系統注冊的程序來打開對應后綴名的文件。
需要的頭文件:windows.h,winbase.h(前者是試驗出來,后者是msdn上說明),另外,這兩者的先后順序不能變。
msdn上的說明:[url]http://msdn.microsoft.com/en-us/library/ms682 425[/url](VS.85).aspx
可以看出,通過上面的幾個不同的方法,都可以實現在應用程序中打開其他應用程序的目的,其中有些方法可能會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的!
關於三個SDK函數: WinExec, ShellExecute,CreateProcess 的其他注意事項:
1、定義頭文件
原作者的內容刪去。
這個是引用新函數都必須注意的內容。但是MS的頭文件引用順序有點怪,比如上面的三種清理。另外,如果用了預編譯,那么記得在任何源程序中的#include "stdafx.h"之前的引用都會失效,從其后才生效。(不可否認,預編譯有他的好處,尤其當程序很大的時候,但是任何好處都是要付出代價的)
2、定義路徑
C++中所表示的路徑要用 " \\ "而不是平常所用的" \ ",所以以上三個函數表示路徑都為:
Disk:\\Directory\\...\\File name
WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL);
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi)
3、注意文件的路徑
在程序a調用程序b的時候,b原來的默認的當前路徑都會變成a的當前路徑。所以,一定要注意。
可以養成使用絕對路徑的習慣,另外,記得打開文件之類的操作,一定要驗證是否有錯。
VC++6.0
Win95
如何在VC++中調用外部的DOS程序?它的函數是什么?如果用API,它的函數是什么?
回答:
你可以使用Windows API函數WinExec、ShellExecute。這兩個函數可以調用Windows和DOS程序。WinExec主要運行EXE文件。如:
WinExec("Notepad.exe Readme.txt", SW_SHOW);
ShellExecute不僅可以運行EXE文件,也可以運行已經關聯的文件。如:
ShellExecute(0, "open", "http://askpro.yeah.net", NULL, NULL, 0);
另外,參考QA000583 "外調一個DOS程序,但是又不想顯示其產生的窗口"。
Vc 5.0
Windows 95
我正在編寫一個程序,想外調一個現成的Com,但是又不想顯示其產生的窗口,我試過可以關閉該窗口,一樣能運行,可是在我的程序中如何獲取該窗口句柄,如何自動關閉它?(飛飛)
其實使用ShellExecute調用DOS程序時可以不顯示窗口,如:
ShellExecute(0, "open", "c:\\tools\\arj.exe", "a c:\\p.arj c:\\*.bat c:\\*.sys", NULL, SW_HIDE);
對於你的問題,你可以使用FindWindow獲得句柄,但關掉窗口就不能再繼續執行了。而你說的關閉窗口還能執行,大概是因為在你關閉窗口時已經運行結束了。
#include "stdafx.h"
#include
#include //ShellExecute 要引用的庫
int main(int argc, _TCHAR* argv[])
{
ShellExecute(NULL,NULL,_T("E:\\Projekt1.exe"),NULL ,NULL,SW_SHOW);
getchar();
return 0;
}
#include "stdafx.h"
#include
#include
#include
DWORD WINAPI ThreadWork(LPVOID num)
{
printf("%d\n",num);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwThreadID[5];
HANDLE threadhandle=CreateThread(NULL,
0,
ThreadWork,
(LPVOID)2,//傳遞的參數
0,
&dwThreadID[0]);
getchar();
return 0;
}