【问题标题】:.NET : How to call CreateProcessAsUser() with STARTUPINFOEX from C#.NET:如何使用 C# 中的 STARTUPINFOEX 调用 CreateProcessAsUser()
【发布时间】:2009-09-16 12:28:41
【问题描述】:

网络上大多数调用 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 崩溃了:(

感谢您的任何想法。谢谢。

【问题讨论】:

    标签: c# .net pinvoke


    【解决方案1】:

    我认为你应该像 STARTUPINFO 一样传递它,我的意思是使用 ref 关键字。结构的编组与为 STARTUPINFO 完成的方式相同。

    【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2012-05-20
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多