![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 leon ![]()
![]() |
我上微軟查了一下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 |
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樓 |
如果我沒記錯的話, 第一個參數只能是 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
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |