C# 包装器到 C++ 函数 - 运行一次,工作正常。运行两次,程序挂起

Posted

技术标签:

【中文标题】C# 包装器到 C++ 函数 - 运行一次,工作正常。运行两次,程序挂起【英文标题】:C# wrapper to C++ function - Run once, works okay. Run twice, program hangs 【发布时间】:2014-03-19 14:55:09 【问题描述】:

所以我正在使用 C# 包装器到 C++ 库,并尝试添加另一个函数。我已经在 C# 中创建了函数声明并且它正在工作。但它只工作一次。当我第二次尝试运行它时,程序挂起。

互操作定义和声明位于https://github.com/joshglenn/interception-cs/blob/master/kchordr/Program.cs

我运行的代码在这里:https://github.com/joshglenn/interception-cs/blob/master/kchordr/InterceptionDemoForm.cs

第一次运行良好但在第二次启动时挂起的函数是 GetHardwareID()。

我的问题是,我该如何解决这个问题?这似乎是内存泄漏?

【问题讨论】:

【参考方案1】:

要从 WinAPI 调用中获取错误代码,请使用 Marshal.GetLastWin32Error(); 还记得用“Set Last Error = true”来装饰你的电话;

这是我在任务栏图标上调用弹出窗口的示例:

[DllImport("shell32.dll",SetLastError=true)]
public static extern bool Shell_NotifyIcon(uint dwMessage, [In] ref NotifyIconData pnid);

用法:

//call your code like you usually call the method
bool callResult = Caller.Shell_NotifyIcon((uint)NotifyIconMessage.NIM_ADD, ref n);

//afther that call the GetLastError to get the error code
int errorCode = Marshal.GetLastWin32Error();

google 一下错误代码,看看是什么意思

【讨论】:

谢谢。那会派上用场的。事实证明,我的错误是由于底层 API 使用不当引起的。我的函数声明是正确的。再次感谢! 原来我的函数声明没问题。我错误地使用了底层 API。我将您的答案标记为答案,因为这应该可以帮助其他人解决类似问题。

以上是关于C# 包装器到 C++ 函数 - 运行一次,工作正常。运行两次,程序挂起的主要内容,如果未能解决你的问题,请参考以下文章

从非托管 c++ 调用 C# 函数(通过托管包装器)

将数组从非托管 C++ 传递到 C#

属性包装器到属性包装器

包装 OpenCV C++ 以与 C# 一起使用

c++ lib dll 的 C# 包装类

将状态更新从 C++ 中的函数发送到 C#