使用指针参数(WCT)从C#调用C++方法

本文关键字:调用 C++ 方法 WCT 指针 参数 | 更新日期: 2023-09-27 18:25:21

我对从C#调用C++方法的概念很陌生。

假设我想从C#调用C++函数GetThreadWaitChain

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679364(v=vs.85).aspxhttps://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#类型对吗?

使用指针参数(WCT)从C#调用C++方法

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];