2009-06-10 18 views
5

私は別のプロセスをラップする(Win32コンソール)プログラムを書いています。それは、次の例のようにパラメータを受け取り:argvを単一の文字列に変換する

runas.exe user notepad foo.txt 

すなわち:runasuserを解析した後、残りのパラメータを渡して、メモ帳を実行します。

私の問題は、argvが個々のパラメータに分解されていますが、CreateProcessAsUserには1つのlpszCommandLineパラメータが必要です。

このコマンドラインを構築するのはおそらく、argvをスペースでつなぐだけの簡単な方法ではありません。すべてのポインタ?

これは単なる例です。私の最初の引数は実際にはユーザー名ではなく、その中にスペースが入っている可能性があります。これにより、手動で​​の結果を解析する手間がかかります。

同様に、argvの素朴な連結は、元の引数が引用され、その中にスペースが含まれている場合に対処する必要があるため、機能しません。

+1

私は大丈夫だと思う「スペースと一緒に戻ってARGVに参加する」と言うだろう。何が違うと思いますか? –

+0

Benoitは、 'runas.exe user notepad" foo bat.txt "'では動作しないためです。 – avakar

+3

スペースを含むargsを引用することを忘れないでください。 – Hasturkun

答えて

7

は、手動でそれらを再結合することは困難である:あなたが再結合彼らに試みることができる

、私はそれがうまくいくと思いますが、the same command line escaping rules that windows hasを次のようにしてください。これはあなたが探している簡単な解決策以上のものかもしれません。

また、パラメータにスペースが含まれている場合は、それらを囲む引用符付きの文字列にそれらを結合することもできます。奇妙なエスケープルールの例を次に示します。--folderpath "c:\test\"がある場合、最後のバックスラッシュは二重にする必要があります--folderpath "c:\test\\"

あなたはMFCを使用している場合:

することはでき派生CWinAppののtheApp.m_lpCmdLineから必要な値を得ることができます。 __argc、__argv、またはCommandLineToArgvWを使用して、他の方法にもアクセスできます。

あなたが(でもGUIなし)のみのWin32を使用している場合:

あなたはWinMainからそれを得ることができます。あなたのプログラムのエントリーポイントになることができます。

__argc、__argv、またはCommandLineToArgvWを使用しても、他の方法にアクセスできます。

あなたがメインまたはwmainとコンソールベースのアプリケーションを使用する必要がある場合:Win32 APIのGetCommandLine

は、移動するための方法のようです。あなたはまだ.exeの名前を過ぎるためにこれを解析する必要があります。 exe名/パスの周りの引用符を考慮に入れてください。開始時に引用符がない場合は、開始の次のスペースに移動します。

+0

argvをスペースで連結するとうまくいくようです。 argv [i]に空白が含まれている場合は、その特定の値を引用します。私はいくつかの明らかなエッジケースを試しましたが、それは今のところよく見えます。 –

+0

ここでは、Windows上でコマンドラインでエスケープする混乱について説明します:http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way aspx –

2

GetCommandLine機能を使用できます。

「メイン」ではなく「WinMain」を使用してみませんか?これにより、必要な書式の文字列が得られます。

+2

GetCommandLine呼び出しの結果は、次のCreateProcess呼び出しに渡される前に処理する必要があります。最初の引数は削除する必要があります。プログラム名は二重引用符で囲むことができることに注意してください。 – hvintus

+0

この場合、実行可能ファイルの名前とユーザー名の最初の2つの引数を削除する必要があります。 –

0

十分なスペースが割り当てられた文字列があれば、リストの各項目にstrcatを使用します。はい、スペースで一緒に戻ってくるように簡単です。

編集:もちろん、スペースを含むアイテムは引用符で囲む必要があります。

+0

-1、そう簡単ではありません。 – avakar

+0

彼の例では、そうです。引用符付きのスペースを含む項目を囲む警告は、あなたが右にこれを見るでしょう... – Xetius

1

コマンドラインを返すのWin32 API呼び出しがあります:GetCommandLine

関連する問題