2015-12-01 3 views
1

Я новичок в этой концепции вызова методов C++ из C#.Вызов метода C++ из C# с параметром указателя (WCT)

Предполагая, что я хочу, чтобы вызвать C++ функцию GetThreadWaitChain из C#:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679364(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms681623(v=vs.85).aspx

И я построил модель других типов, на которых вызов зависит:

[DllImport("Advapi32.dll")] 
public static extern void CloseThreadWaitChainSession(IntPtr WctHandle); 

[DllImport("Advapi32.dll")] 
public static extern HANDLE OpenThreadWaitChainSession(UInt32 Flags, UInt32 callback); 

[DllImport("Advapi32.dll")] 
     public static extern BOOL GetThreadWaitChain(
      IntPtr WctHandle, 
      UInt32 Context, 
      UInt32 flags, 
      UInt32 ThreadId, 
      WAITCHAIN_NODE_INFO NodeInfoArray, 
      UInt32 IsCycle 
     ); 

[StructLayout(LayoutKind.Sequential)] 
public struct WAITCHAIN_NODE_INFO 
{ 
    public UInt32 ObjectType; 
    public UInt32 ObjectStatus; 

    public struct LockObject 
    { 
     string ObjectName;     
     UInt64 Timeout; 
     UInt32 Alertable; 
    } 

    public struct ThreadObject 
    { 
     UInt32 ProcessId; 
     UInt32 ThreadId; 
     UInt32 WaitTime; 
     UInt32 ContextSwitches; 
    } 
} 

Как я могу вызвать функцию GetThreadWaitChain? Он принимает указатель на WAITCHAIN_NODE_INFO структуры ...

В настоящее время, это, как я понял, для вызова функции (очевидно, что это не работает):

void CollectWaitInformation(int threadId) 
{ 
    var wctHandle = OpenThreadWaitChainSession(0, 0); 
    WAITCHAIN_NODE_INFO info = new WAITCHAIN_NODE_INFO(); 
    var result = GetThreadWaitChain(wctHandle, 0, 
     GetThreadWaitChainFlags.WCT_OUT_OF_PROC_COM_FLAG, threadID, info , 0); 
} 

ли мой типы C++ отображения для типов C# правильных ?

ответ

4

Прототип функции GetThreadWaitChain неверен. Оно должно быть:

[DllImport("advapi32.dll", SetLastError = true)] 
public static extern bool GetThreadWaitChain(
    IntPtr WctHandle, 
    IntPtr Context, 
    UInt32 Flags, 
    int ThreadId, 
    ref int NodeCount,  
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] 
    [In, Out] 
    WAITCHAIN_NODE_INFO[] NodeInfoArray, 
    out int IsCycle 
); 

При вызове первой выделить массив WAITCHAIN_NODE_INFO.

WAITCHAIN_NODE_INFO[] data = new WAITCHAIN_NODE_INFO[16]; 
+0

Благодарим за ваш ответ! Просто чтобы все было ясно ... Если я вызываю WaitForMultipleObject из моего процесса, который я хочу отлаживать, и вызываю функцию GetThreadWaitChain с идентификатором потока, я получу свои данные в NodeInfoArray в результате? –

+1

Да. Не забудьте проверить возвращаемое значение GetThreadWaitChain. – EylM

+0

Хорошо, спасибо! –

Смежные вопросы