CommandLineToArgvW 関数
[DllImport("shell32.dll", SetLastError = true)]
private static extern IntPtr CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs);
パラメータ:
[in] lpCmdLine タイプ: LPCWSTR
完全なコマンド ラインを含む null で終了する Unicode 文字列へのポインタ。このパラメータが空の文字列の場合、関数は現在の実行可能ファイルへのパスを返します。
[out] pNumArgs 型: int*
argcと同様に、 返された配列要素の数を受け取るintへのポインタ。( argv および argc パラメータ規則の詳細については、「 C コマンドライン パラメータのパラメータ定義 と分析」 を参照してください。)
戻り値:
タイプ: LPWSTR*
argvと同様に、 LPWSTR 値の配列へのポインタ。
関数が失敗した場合、戻り値は NULL になります。さらに詳しいエラー情報を取得するには、GetLastError を呼び出します。
CommandLineToArgvW によって返されるアドレスは、 LPWSTR 値配列の最初の要素のアドレスです。
この配列内のポインターの数は pNumArgs で示されます。Null で終了する Unicode 文字列への 各ポインタは、コマンド ラインで見つかった1 つのパラメータを表します。argv および argc パラメータの規則 の詳細については 、 「パラメータの定義 と C コマンド ライン パラメータの解析」を参照してください。
重要
CommandLineToArgvW は、引用符の外側のスペースをパラメータ区切り文字として扱います。ただし、 lpCmdLine が 任意の数のスペースで始まる場合、CommandLineToArgvW は最初の引数を空の文字列として扱います。lpCmdLine の末尾にある余分なスペースは無視します 。
public static string[] commandLineToArgs(string commandLine)
{
int argc;
var argv = CommandLineToArgvW(commandLine, out argc);
if (argv == IntPtr.Zero)
throw new System.ComponentModel.Win32Exception();
try
{
var args = new string[argc];
for (var i = 0; i < args.Length; i++)
{
var p = Marshal.ReadIntPtr(argv, i * IntPtr.Size);
args[i] = Marshal.PtrToStringUni(p);
}
return args;
}
finally
{
Marshal.FreeHGlobal(argv);
}
}
GetCommandLineW関数を使用すると、 lpCmdLine への引数として使用するのに適したコマンド ライン文字列を 取得できます 。この関数は、プログラム名を含むコマンド ラインを受け入れます。プログラム名は引用符で囲まれていても、囲まれていない場合もあります。
private static string[] GetCommandLine(this Process process)
{
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id))
using (ManagementObjectCollection objects = searcher.Get())
{
var commandLine = objects.Cast<ManagementBaseObject>().SingleOrDefault()?["CommandLine"]?.ToString();
if (string.IsNullOrWhiteSpace(commandLine))
return new string[] { };
return commandLineToArgs(commandLine);
}
}
参考文献:
1. https://www.cnblogs.com/nanfei/p/14005863.html
2. CommandLineToArgvW 関数 (shellapi.h) - Win32 アプリ | Microsoft Learn
この部分の説明は次のとおりです (この部分はC コマンド ライン引数で分析されます | Microsoft Learn )。
3. C コマンド ライン引数を分析する | Microsoft Learn
4. GetCommandLineW 関数 (processenv.h) - Win32 アプリ | Microsoft Learn