【问题标题】:Free memory of IntPtrIntPtr 的空闲内存
【发布时间】:2017-03-21 05:10:06
【问题描述】:

我将IntPtr 传递给函数SendMessageTimeout,如下所示。 SendMessageTimeout 属于 user32.dll。

我不知道这个 DLL 如何将内存分配给作为引用传递的IntPtr,即result

如何释放传递给该函数的IntPtr的内存?

[DllImport("user32")]
public static extern int SendMessageTimeout(
    int hwnd, int msg, int wparam, int lparam, 
    int fuFlags, int uTimeout, IntPtr lpdwResult);       

if (handle > 0 && GetWindowText(handle, Buff, nChars) > 0)
{
    this.log("GetForegroundWindow : " +Buff.ToString());
    foreach (string str in this.titleList)
    {
        if (Buff.ToString().ToLower().Contains(str.ToLower()))
        {
            IntPtr result = IntPtr.Zero;
            if (SendMessageTimeout(handle, 0x0010, 0, 0, 0x0002, 2000, result) != 0) 
                DestroyWindow(handle);

            killed = true;
            break;
        }
    }
}

【问题讨论】:

  • 既然文档说明该参数是可选的,为什么不干脆省略它呢? (即通过IntPtr.Zero)。
  • 谢谢。是的,我认为通过 IntPtr.Zero 对我来说是有意义的。顺便说一句,如果我必须使用这个参数,有没有合适的方法来释放指针。我找不到任何有关 user32.dll 函数的适当文档
  • 我,也不是。谷歌搜索后,我不知道我作为调用者是否负责释放内存,或者我是否可以依靠“系统”来处理释放这些内存。
  • 有问题的指针用于存储消息处理的结果。这是否是指向需要释放的内存的指针,如果是,如何释放它,取决于消息。您需要查找要发送的特定消息的文档。

标签: c# .net windows visual-studio


【解决方案1】:

完成后使用Marshal.FreeHGlobal

您可以使用 FreeHGlobal 从由 AllocHGlobal、ReAllocHGlobal 或任何等效的非托管 API 方法分配的全局堆中释放任何内存。

 Marshal.FreeHGlobal(lpdwResult);

【讨论】:

  • 你确定吗?我在the documentation of SendMessageTimeout 中没有找到关于如何/是否完全释放内存的证据。
  • 这可能回答了你的疑问? stackoverflow.com/questions/4949084/…
  • 对不起,没有。查看this SO answer,他也确实释放返回的IntPtr 的内存。在我看来,你不能在不知道被调用函数的文档的情况下盲目地在 IntPtr 上调用 FreeHGlobal
  • @UweKeim:我认为你是对的。如果他不需要知道输出值,可能传递 IntPtr.Zero 是有意义的。
猜你喜欢
  • 2018-08-21
  • 2012-09-18
  • 2015-08-17
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2016-12-24
  • 2011-07-13
相关资源
最近更新 更多