C# .NET:如何使用C中的STARTUPINFOEX调用CreateProcessAsUser()
web上用于调用CreateProcessAsUser的大多数示例代码具有与以下类似的PInvoke签名: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
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的提示——这是完全正确的。