C# コマンドラインパラメータの分割

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

おすすめ

転載: blog.csdn.net/qq_39397927/article/details/132714599