【轉】在MFC程序中調用或打開其他文件方式

    原文出處:http://blog.csdn.net/b_h_l/article/details/7717744


  三個SDK函數: WinExec,ShellExecute ,CreateProcess可以實現調用其他程序的要求,其中以WinExec最爲簡單,ShellExecute比WinExec靈活一些,CreateProcess最爲複雜

(一)WinExec  

       需要的頭文件:windows.h,winbase.h(前者是試驗出來,後者是msdn上說明),另外,這兩者的先後順序不能變。
  這個函數最簡單,只有兩個參數,原型如下:  
  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文件。  


 (二)ShellExecute  

  需要的頭文件:windows.h,shellapi.h(前者是我試驗出來的,後者是msdn說需要的,這裏發現後面的頭文件不加也無妨,不管)。另外這兩者的先後順序不能變。 

  原型如下:  
  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不支持定向輸出。 
  這個函數可以打開任意文件,會調用系統默認程序來打開對應後綴名的文件。 


(三)CreateProcess  
  需要的頭文件:windows.h,winbase.h(前者是試驗出來,後者是msdn上說明),另外,這兩者的先後順序不能變。 

       原型如下:  
  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); 
  這個函數可以打開任意文件,會調用系統註冊的程序來打開對應後綴名的文件。 

   PS:

       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) ;

一般來說還是建議直接用絕對路徑解決以防出現不必要的問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章