台灣最大程式設計社群網站
線上人數
1161
 
會員總數:244546
討論主題:188700
歡迎您免費加入會員
討論區列表 >> C/C++ >> 請問如何夾帶參數執行exe
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請問如何夾帶參數執行exe
價值 : 50 QP  點閱數:402 回應數:4

樓主

leon
門外漢
0 23
458 48
發送站內信



我上微軟查了一下docs

https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessa

有提到透過 CreateProcess 可以跑執行檔

不過我需要在執行檔後面夾帶參數

比方說安裝檔後面夾帶一個參數可以達到某一種效果 如-> xxxx.exe /s

可是參數該怎麼夾帶呢

我把參數打在lpCommandLine上 如
CreateProcess("c:\\Setup.exe","/s", NULL, NULL, false, 0, NULL, NULL, &si, &pi);

這樣的話c:\\Setup.exe 是有執行 可是/s 似乎沒效


請問C++ 有甚麼方法可以讓執行有夾帶參數的EXE 如預期效果的運行呢?

搜尋相關Tags的文章: [ exe ] ,
本篇文章發表於2018-12-19 00:39
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

Raymond
檢舉此回應
試試把執行檔及參數全放在 lpCommandLine 參數內, 大概這樣:

本篇文章回覆於2018-12-20 00:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

leon
檢舉此回應
可以用 可是不太懂為什麼試打在地2個參數 就會跑 可是如果打
TCHAR cmdline[_MAX_PATH] = _T("c:\\Setup.exe /s");
CreateProcess(cmdline,NULL,NULL,NULL,false,0,NULL,NULL,&si,&pi);

就沒反應
本篇文章回覆於2018-12-20 16:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Raymond
檢舉此回應
如果我沒記錯的話, 第一個參數只能是 NULL 跟執行檔的 full 或 partial path.
如果第一個參數是 NULL, 執行檔的名字(或檔夾/名字) 必須是第二個參數的第一組字列. (這也是我上面提供的做法)
如果第一個參數是執行檔的名字(或檔夾/名字), API 會把第二個參數打包作為該執行檔的 command line (這是你一開始的作法).

如果依你一開始的作法, 問題來了: 第二個參數是怎樣傳給執行檔的? 執行檔又用什麼方法去讀取?

根據 MSDN 裡 CreateProcess() 的說明, 執行檔可以用 GetCommandLine() API 來獲取第二個參數. 但一般的 C/C++ 程式不會用 GetCommandLine(), 而是透過 main() 的 argc/argv 參數來取得 command line. 問題就出在這裡. 當 CreateProcess() 第二個參數的字串傳給執行檔時, 參數的字組會傳入到 argv[0], argv[1], ... argv[argc-1] 裡.

看出問題了嗎? CreateProcess() 的 lpCommandLine 裡的參數會從執行檔的 argv[0] 開始. 但一般的 C/C++ 程式在手動執行時, argv[0] 存放的是執行檔的名字, 所以一般的 C/C++ 程式會從 arv[1] 開始去讀取 command line arguments.

用你一開始的做法, "/s" 的確有傳入給 setup.exe, 但它傳入的位置是 argv[0]. 要解決這個問題, 你必須把相對 argv[0] 這個位置的參數填掉. 一般的作法是重複放入執行檔的名字:

但如果執行檔是用 GetCommandLine() 來獲取 command line arguments, 那上面這寫法又可能不太適用. 所以最好的方法就是用我第一次提供的方法.
本篇文章回覆於2018-12-21 00:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

leon
檢舉此回應
謝謝大大細心的講解,小弟似乎有點明白
本篇文章回覆於2018-12-21 08:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.