2009-06-10 38 views
5

我正在編寫一個包裝另一個進程的(Win32控制檯)程序;它需要的參數如下面的例子:將argv轉換回單個字符串

runas.exe user notepad foo.txt 

即:runas解析user然後將運行記事本,使剩餘的參數。

我的問題是argv被分解成各個參數,但CreateProcessAsUser需要一個lpszCommandLine參數。

構建這個命令行可能並不簡單,只需將空間加入argv即可。任何指針?

這只是一個例子。我的第一個參數實際上不是用戶名,並且可能有空格。這使得手動解析​​的結果非常棘手。

同樣,argv的天真級聯不起作用,因爲它需要處理原始參數被引用並且可能在其中包含空格的情況。

+1

我會說「用空格加盟的argv一起回來」就可以了。是什麼讓你覺得不對? – 2009-06-10 11:30:14

+0

Benoît,因爲它不適用於`runas.exe用戶記事本'foo bat.txt'`。 – avakar 2009-06-10 11:35:39

+3

不要忘記引用任何包含空格的參數 – Hasturkun 2009-06-10 11:35:41

回答

7

手動重新組合很難:

你可以嘗試重新將它們組合起來,我認爲這是可行的,但一定要下the same command line escaping rules that windows has。這可能不僅僅是您尋找的簡單解決方案。

此外,如果有任何參數中有空格,那麼您會希望將它們連接到帶有引號的字符串。以下是一個奇怪的轉義規則示例:如果您有--folderpath "c:\test\",則最後一個反斜槓必須加倍--folderpath "c:\test\\"

如果您正在使用MFC:

你可以從你的派生的CWinApp的theApp.m_lpCmdLine得到你想要的值。請注意,您仍然可以用__argc和__argv或CommandLineToArgvW訪問它們。

如果你只使用Win32(即使沒有GUI):

您可以從WinMain得到它。這可能是您程序的入口點。

請注意,您仍然可以用__argc和__argv或CommandLineToArgvW以其他方式訪問它們。

如果必須使用主或wmain一個基於控制檯的應用程序:

的Win32 API的GetCommandLine似乎是要走的路。你仍然需要解析這個來通過.exe名稱。考慮周圍的exe名稱/路徑引號。如果在開始時沒有這樣的報價,那麼只需進入下一個開始空間。

2

您可以使用GetCommandLine函數。

爲什麼不使用'WinMain'而不是'main'?這應該給你想要的格式的字符串。

0

假設你有一個足夠的空間分配的字符串,然後在列表中的每個項目上使用strcat。是的,就像將它們與空間連接在一起一樣簡單。

編輯:當然,您需要將任何包含空格的項目放在引號內。