Большинство примеров кода в Интернете для вызова 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 (): (
Любые идеи с благодарностью приняты. Спасибо.