.NET: كيفية PInvoke UpdateProcThreadAttribute
سؤال
وأنا أحاول أن PInvoke UpdateProcThreadAttribute()
على ويندوز 7 ولكن محاولاتي تبقي فقط العودة 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
);
هل هذا الإعلان معقول؟ شكرا.
المحلول
لديك بعض المشاكل مع إعلان الخاص بك ولكن واحد هو أن يعطي لك خطأ غير معتمد والمعلمة السمة. A DWORD_PTR ليس مؤشر بل مؤشر الحجم عدد صحيح بدون إشارة وذلك بدلا من المرجع UINT أنه يجب أن يكون IntPtr.
والإعلان وأود أن استخدام هو:
[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.
لا تنتمي إلى StackOverflow