【发布时间】: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 崩溃了:(
感谢您的任何想法。谢谢。
【问题讨论】: