.NET: Как вызвать CreateProcessAsUser () с STARTUPINFOEX из C # - PullRequest
0 голосов
/ 16 сентября 2009

Большинство примеров кода в Интернете для вызова CreateProcessAsUser () имеет подпись PInvoke, аналогичную следующей:

    public static extern bool CreateProcessAsUser(IntPtr hToken,
        string lpApplicationName,
        string lpCommandLine,
        ref SECURITY_ATTRIBUTES lpProcessAttributes,
        ref SECURITY_ATTRIBUTES lpThreadAttributes,
        bool bInheritHandles,
        int creationFlags,
        IntPtr environment,
        string currentDirectory,
        ref STARTUPINFO startupInfo,
        out PROCESS_INFORMATION processInfo);

Проблема в том, что вместо этого я хочу передать STARTUPINFOEX, что разрешено в Vista / W7. Если бы я писал C / C ++, я мог бы просто разыграть его.

Как мне справиться с этим в C #? STARTUPINFOEX выглядит так:

    [StructLayout(LayoutKind.Sequential)]
    public struct STARTUPINFOEX
    {
        public STARTUPINFO StartupInfo;
        public IntPtr lpAttributeList;
    };

Должен ли я вместо этого передавать IntPtr в структуру? Если я изменю подпись Pinvoke и сделаю что-то вроде этого ...

   IntPtr pStartupInfoEx = Marshal.AllocHGlobal(Marshal.SizeOf(startupInfoEx));
   Marshal.StructureToPtr(startupInfoEx, pStartupInfoEx, true);

.. Я сбой моей оболочки при выполнении CreateProcessAsUser (): (

Любые идеи с благодарностью приняты. Спасибо.

1 Ответ

0 голосов
/ 16 сентября 2009

Я думаю, вы должны просто передать его как STARTUPINFO, я имею в виду ключевое слово ref Маршалинг структуры выполняется так же, как и для STARTUPINFO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...