.NET: Wie PInvoke UpdateProcThreadAttribute
Frage
Ich versuche, auf Windows 7 PInvoke UpdateProcThreadAttribute()
aber meine Versuche, halten nur FALSCH mit einem Last-Win32-Fehler 50 zurück.
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
);
Hier ist mein Versuch an der PInvoke Signatur:
[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
);
Ist diese Erklärung sinnvoll? Danke.
Lösung
Sie haben ein paar Probleme mit Ihrer Erklärung, aber die, die Sie nicht unterstützt Fehler geben wird, um das Attribut Parameter. Ein DWORD_PTR ist kein Zeiger, sondern ein Zeiger Größe unsigned integer so anstatt ref uint es sollte ein IntPtr sein.
Die Erklärung würde ich verwenden ist:
[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:
Ich habe versucht, dies als Kommentar zu tun, aber es dauert nicht sehr gut codieren.
Für einen Prozess handelt benötigen Sie einen IntPtr den Griff zu halten. So müssen Sie so etwas wie:
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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow