plupart du code d'échantillon sur le Web pour appeler CreateProcessAsUser() a une signature PInvoke semblable au suivant:.NET: Comment appeler CreateProcessAsUser() avec STARTUPINFOEX de C#
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);
Le problème est, je veux passez STARTUPINFOEX à la place, ce qui est autorisé dans Vista/W7. Si j'écrivais en C/C++ alors je pourrais juste le lancer.
Comment dois-je gérer cela en C#? STARTUPINFOEX ressemble à ceci:
[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFOEX
{
public STARTUPINFO StartupInfo;
public IntPtr lpAttributeList;
};
Dois-je transmettre un IntPtr à la structure? Si je change la signature Pinvoke et faire quelque chose comme ça ...
IntPtr pStartupInfoEx = Marshal.AllocHGlobal(Marshal.SizeOf(startupInfoEx));
Marshal.StructureToPtr(startupInfoEx, pStartupInfoEx, true);
.. je crash ma coquille quand je l'exercerai CreateProcessAsUser() :(
Toutes les idées reçues avec reconnaissance. Merci.
ne donc vous dire déclarer CreateProcessAsUser ref STARTUPINFOEX à la place. mot-clé
ref
de ref STARTUPINF O? – mrbouffantC'est ce que je veux dire – cedrou
OK, cela ne plante pas MAIS l'appel ne fonctionne pas - renvoyer l'erreur 183. Même si j'oublie de définir le lpAttributeList et l'utiliser essentiellement comme STARTUPINFO (c'est-à-dire lpAttributeList) l'appel renvoie 183. Argh. – mrbouffant