Question

J'essaie de PInvoke UpdateProcThreadAttribute () sur Windows 7, mais mes tentatives ne font que renvoyer FALSE avec une dernière erreur Win32 de 50.

Function declaration (from MSDN)

BOOL WINAPI UpdateProcThreadAttribute(
  __inout    LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
  __in       DWORD dwFlags,
  __in       DWORD_PTR Attribute,
  __in       PVOID lpValue,
  __in       SIZE_T cbSize,
  __out_opt  PVOID lpPreviousValue,
  __in_opt   PSIZE_T lpReturnSize
);

Voici ma tentative de signature PInvoke:

[DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, SetLastError = true)]
public static extern bool UpdateProcThreadAttribute
(
            IntPtr lpAttributeList,
            UInt32 dwFlags,
            ref UInt32 Attribute,
            ref IntPtr lpValue,
            ref IntPtr cbSize,
            IntPtr lpPreviousValue,
            IntPtr lpReturnSize
);

Cette déclaration est-elle raisonnable? Merci.

Était-ce utile?

La solution

Vous avez quelques problèmes avec votre déclaration mais celle qui vous donne l'erreur non supportée est le paramètre Attribute. Un DWORD_PTR n'est pas un pointeur, mais plutôt un entier non signé de la taille d'un pointeur. Par conséquent, plutôt que de faire référence, il doit s'agir d'un IntPtr.

La déclaration que je voudrais utiliser est la suivante:

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UpdateProcThreadAttribute(
        IntPtr lpAttributeList, uint dwFlags, IntPtr Attribute,
        IntPtr lpValue, IntPtr cbSize, IntPtr lpPreviousValue, 
        IntPtr lpReturnSize);

EDIT:

J'ai essayé de faire cela comme un commentaire mais cela ne prend pas très bien le code.

Pour un handle de processus, vous avez besoin d’un IntPtr pour le tenir. Donc, vous auriez besoin de quelque chose comme:

IntPtr hProcess //previously retrieved.
IntPtr lpAttributeList //previously allocated using InitializeProcThreadAttributeList and Marshal.AllocHGlobal.

const int PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = 0x00020000;
IntPtr lpValue = Marshal.AllocHGlobal(IntPtr.Size); 
Marshal.WriteIntPtr(lpValue, hProcess);
if(UpdateProcThreadAttribute(lpAttributeList, 0, (IntPtr)PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, lpValue, (IntPtr)IntPtr.Size, IntPtr.Zero, IntPtr.Zero))
{
    //do something
}

//Free lpValue only after the lpAttributeList is deleted.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top