在vc中怎么調用exe文件並傳遞參數


2011-09-11 16:24 2002人閱讀 評論(1) 收藏 舉報
exenullattributessecuritysystemc
 http://www.cnblogs.com/aivdesign/articles/1240429.html

1.調用SHELL
HINSTANCE ShellExecute( HWND hwnd,
    LPCTSTR lpOperation,
    LPCTSTR lpFile,
    LPCTSTR lpParameters,
    LPCTSTR lpDirectory,
    INT nShowCmd
);
2.創建一個新的進程。
BOOL CreateProcess(
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,(welcomebbs)
  LPPROCESS_INFORMATION lpProcessInformation
);
具體參數說明請參照MSDN,另外這是WINDOWS系統原生的API,與用不用VC無關。





VC++ 調用EXE文件,同時對EXE程序賦輸入參數(welcomebbs)
::ShellExecute(NULL, "open", pszPName, "參數1 參數2 參數3", NULL, SW_SHOW); 





VC 如何跟據所配制的參數,動態生成EXE文件

一個軟件上 有一個按鈕和一個文本框 ,文本框里輸入“你好”,點按鈕,就生成一個exe文件,運行它就彈出一個MessageBox("你好");

需要2個程序
程序A 程序設計如下:
程序A 運行后 讀取自身的最后10個字節,然后MessageBox
程序B 設計如下:
把 程序A 作為資源 放到程序B中
點擊按鈕時候,把 資源拷貝到內存,對這個資源追加10個字節,根據 文本框的內容填充這10個字節,然后 把內存中的資源 寫成exe文件。
這是生成定制木馬的一貫做法



如何在程序中調用exe文件

1.   如何在vc程序中調用exe文件 ShellExecute(this->m_hWnd,"open","notepad.exe", "c:\\scandisk.log","",SW_SHOW ); 
用創建獨立子進程的方法。
       也可以不獨立,下面的代碼創建的子進程是獨立的。
BOOL ret; PROCESS_INFORMATION pi; 
STARTUPINFO si; 
si.cb = sizeof(si); 
si.wShowWindow = SW_SHOWNORMAL; 
ret = CreateProcess(_T("c:\xx.exe"),NULL,NULL,FALSE,0, NORMAL_PRIORITY_CLASS,NULL,NULL,&si,π);
if (ret){ CloseHandle(pi.hThread); 
CloseHandle(pi.hProcess); } 

2.   學習如何在程序中調用.exe文件 
    System.Diagnostics.Process proc = new System.Diagnostics.Process(); //程序名稱 
    proc.StartInfo.FileName = "mt3000.exe"; //參數 
    proc.StartInfo.Arguments = "/p1 /b38400 /fstock /mr"; //隱藏 
    proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //執行 
    proc.Start(); WinExec("calc.exe",SW_SHOW);//調用計算器 
    ShellExec(NULL,"open","calc.exe",NULL,NULL,SW_SHOW);//同上 
    CreateProcess...//參數比較煩,懶得寫 


3.    關於在一個程序中調用另一個程序的exe
      這兩天在做音頻識別的程序中,想將一個音頻識別的程序加進我的大程序中。 但是在加音頻程序進來的時候,有很多的問題,無法加進去。迫於無奈,只得在大程序的音頻識別一塊調用音頻識別的小程序的exe文件,效果也不錯。我覺得以后也可以借鑒。 
       以下是調別的程序的exe文件的小代碼: 
SHELLEXECUTEINFO ShExecInfo = {0}; 
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
ShExecInfo.hwnd = NULL; 
ShExecInfo.lpVerb = NULL; 
ShExecInfo.lpFile = "E:\\SimpleDict\\Debug\\simpledict.exe";//別的程序的exe文件 
Info.lpParameters = ""; 
ShExecInfo.lpDirectory = NULL; 
ShExecInfo.nShow = SW_SHOW; 
ShExecInfo.hInstApp = NULL; 
ShellExecuteEx(&ShExecInfo); 
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);//執行完別的程序的exe文件后,返回主程序。 

4.    C++程序中調用exe可執行文件
       當項目比較大的時候,通常會分開來開發,如果分開的部分只是一些函數或類,整合的時候 就可以使用靜態庫或動態庫。但如果分開的是一個exe文件,整合的時候,就要通過調用exe文件來使用。尤其是當第三方軟件是一個用c語言編寫的exe文件時,更是需要如此。 
       最近在我所開發的LCDS系統當中就碰到了這樣的問題。他需要調用一個分類器來處理數據,而手頭上的分類器是經典的C4.5決策樹分類器,它是用c語言寫的,沒有.h頭文件,生成的是一個exe文件,通過在命令行執行main函數來處理數據。如果想把其改成靜態庫或動態庫,因為沒有頭文件,改寫后似乎不好調用其函數,因此考慮直接調用其生成的exe文件。可考慮的方法有: 
      1.使用system函數      
      2.使用execl或execv函數         
      3.使用WinExec函數     
      4.使用CreateProcess函數 
      5.使用ShellExecuteEx函數 
      system函數和execl、execv函數不能控制程序窗口是否顯示,我要的效果是不顯示該exe程序的窗口,所以這兩種方法不予考慮。WinExec函數不好控制主程序來等該exe程序的結束,所以放棄。CreateProcess函數是新建一個進程,所以,你必須人為地控制該進程的生死,不如ShellExecuteEx方便,所以最終我選擇的是ShellExecuteEx函數。
      程序如下: 
SHELLEXECUTEINFO ShExecInfo = {0}; 
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
ShExecInfo.hwnd = NULL; 
ShExecInfo.lpVerb = _T("open"); 
ShExecInfo.lpFile = _T("c4.5.exe"); 
ShExecInfo.lpParameters = _T("-f train"); 
ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE; 
ShExecInfo.hInstApp = NULL; 
ShellExecuteEx(&ShExecInfo); 
WaitCursorBegin(); 
WaitForSingleObject(ShExecInfo.hProcess,INFINITE); 
WaitCursorEnd(); 
比如c:\notpad.exe 可以這么寫(比如按鈕按下) winexec('c:\notpad.exe',1); 這樣就行了
(3)ShellExecute()也行
(4)winexec('C:\WINNT\system32\notepad.exe',0)  參數1:.exe文件全路徑名 參數2: 控制參數 

5.    關於在VC中調用其它EXE
      三個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 等等,就不會出現正常的窗體,但是已經被加到任務列表里了。 

     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", "iexplore.exe","http://www.welcomebbs.com",/ NULL, NULL, SW_SHOWNORMAL); // 打開網頁www.welcomebbs.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 (welcomebbs)原型如下: 
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,π);
      可以看出,通過上面的幾個不同的方法,都可以實現在應用程序中打開其他應用程序的目的,其中有些方法可能會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的! 

關於三個SDK函數: WinExec, ShellExecute,CreateProcess (welcomebbs)的注意 
1、定義頭文件 在頭文件stdafx.h中必須定義以下兩個頭文件: 
#include <shlobj.h> // 可替換為 windows.h 
#include <shellapi.h> 如果定義了頭文件 #include <windows.h>的話就不必定義 #include <shlobj.h>了,"windows.h" 不光是包含了"shellapi.h",它還定義了許多數據類型,如果沒有這些數據類型,shellapi.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,π);

分享到: 
上一篇:在win

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM