2009-09-16 3 views
0

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.

Répondre

0

Je pense que vous devriez juste passer comme le STARTUPINFO, je veux dire avec le le marshaling de la structure se fait de la même façon, il est fait pour la STARTUPINFO.

+0

ne donc vous dire déclarer CreateProcessAsUser ref STARTUPINFOEX à la place. mot-clé ref de ref STARTUPINF O? – mrbouffant

+0

C'est ce que je veux dire – cedrou

+0

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

Questions connexes