我正在尝试在 Windows 7 上使用 PInvoke UpdateProcThreadAttribute(),但我的尝试只是不断返回 FALSE,最后的 Win32 错误为 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
);

这是我对 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
);

这个声明合理吗?谢谢。

最佳答案

您的声明存在一些问题,但给您带来不支持错误的是 Attribute 参数。 DWORD_PTR 不是指针,而是指针大小的无符号整数,因此它应该是 IntPtr 而不是 ref uint。

我将使用的声明是:

    [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);

编辑:

我试图将其作为评论来做,但它不需要很好地编码。

对于进程句柄,您需要一个 IntPtr 来保存句柄。所以你需要类似的东西:
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.

关于c# - .NET : How to PInvoke UpdateProcThreadAttribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1427196/

10-12 14:09