Я новичок в этой концепции вызова методов 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# правильных ?
Благодарим за ваш ответ! Просто чтобы все было ясно ... Если я вызываю WaitForMultipleObject из моего процесса, который я хочу отлаживать, и вызываю функцию GetThreadWaitChain с идентификатором потока, я получу свои данные в NodeInfoArray в результате? –
Да. Не забудьте проверить возвращаемое значение GetThreadWaitChain. – EylM
Хорошо, спасибо! –