Использование Python mock для слежки за вызовами существующего объекта

В дополнение к хорошему и чисто управляемому решению на Earwicker , для полноты можно отметить, что Windows также предоставляет CommandLineToArgvW для разбиения строки на массив строк:

LPWSTR *CommandLineToArgvW(
    LPCWSTR lpCmdLine, int *pNumArgs);

Разбирает строку командной строки Unicode и возвращает массив указателей на аргументы командной строки, а также количество таких аргументов, которое аналогично стандартным значениям времени выполнения argv и argc C.

blockquote>

Пример вызова этого API из C # и распаковки результирующего массива строк в управляемый код можно найти на странице « Преобразование строки командной строки в Args [] с использованием CommandLineToArgvW () API ». Ниже приведена несколько более простая версия того же кода:

[DllImport("shell32.dll", SetLastError = true)]
static extern IntPtr CommandLineToArgvW(
    [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs);

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);
    }
}

24
задан Rod 18 September 2013 в 17:45
поделиться