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

Posted

技术标签:

【中文标题】使用指针参数 (WCT) 从 C# 调用 C++ 方法【英文标题】:Calling C++ method from C# with pointer parameter (WCT) 【发布时间】:2015-12-01 12:42:43 【问题描述】:

我不熟悉从 C# 调用 C++ 方法的概念。

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

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# 类型?

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的回答!只是为了让事情变得清楚......如果我从我想要调试的进程中调用 WaitForMultipleObject,并使用线程 ID 调用 GetThreadWaitChain 函数,我将在 NodeInfoArray 中获取我的数据? 是的。不要忘记检查 GetThreadWaitChain 的返回值。 GetThreadWaitChain 函数总是返回错误...我已经发布了另一个关于它的问题:***.com/questions/34139351/…

以上是关于使用指针参数 (WCT) 从 C# 调用 C++ 方法的主要内容,如果未能解决你的问题,请参考以下文章

当参数之一是指针数组时,如何从 C# 调用 C++ DLL

c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法

如何将委托或函数指针从 C# 传递到 C++ 并使用 InternalCall 调用它

如何从 C# 调用具有 void* 回调和对象参数的 C++ Dll 中的函数

C#如何调用C++的DLL的结构体数组指针

当引入参数时,从指针调用成员函数的 C++ 调用内存访问冲突