C# .NET:如何使用C中的STARTUPINFOEX调用CreateProcessAsUser()

C# .NET:如何使用C中的STARTUPINFOEX调用CreateProcessAsUser(),c#,.net,pinvoke,C#,.net,Pinvoke,web上用于调用CreateProcessAsUser的大多数示例代码具有与以下类似的PInvoke签名: public static extern bool CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SE

web上用于调用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时崩溃shell:


任何想法都受到了感激。谢谢。

我想你应该像传递STARTUPINFO一样传递它,我的意思是使用ref关键字。结构的封送处理与STARTUPINFO的处理方式相同。

那么您的意思是用ref STARTUPINFOEX而不是ref STARTUPINFO声明CreateProcessAsUser?好的,这不会崩溃,但调用不起作用-返回错误183。即使我忘记了设置lpAttributeList并将其用作STARTUPINFO(即lpAttributeList),调用也会返回183。Argh.终于修复了它-当我声明STARTUPINFOEX时,我未能将嵌入式STARTUPINO的cb成员设置为Marshal.SizeOf返回的值。现在一切都正常了,我可以从托管代码中重新租入W7下的进程:感谢关于ref STARTUPINFOEX的提示——这是完全正确的。