سؤال

وأنا أحاول أن 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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top