2017-03-21 16 views
0

IntPtrを次のように関数SendMessageTimeoutに渡しています。 SendMessageTimeoutはuser32.dllに属します。IntPtrの空きメモリ

このDLLがすべてIntPtrに渡されたメモリをどのように調べているかわかりません。つまり、です。

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; 
     } 
    } 
} 
+1

ドキュメントには、このパラメータがオプションであると記載されているので、省略しないでください。 (すなわち 'IntPtr.Zero'を渡します)。 –

+0

ありがとうございます.Yeah私はIntPtr.Zeroを渡すことが私にとって理にかなっていると思います。 Btw私はこのパラメータを使用する必要がある場合は、ポインタをリリースする適切な方法はありますか?私はuser32.dll関数 – Gajukorse

+0

のいずれかの適切なドキュメントを見つけられませんでした。グーグルでは、発信者がメモリを解放する責任を負っているのか、このメモリを解放するために "システム"に頼ることができるかどうかについて本当の手がかりはありません。 –

答えて

0

終了するとMarshal.FreeHGlobalを使用してください。

FreeHGlobalを使用すると、AllocHGlobal、ReAllocHGlobal、または同等のアンマネージドAPIメソッドによって割り当てられたグローバルヒープのメモリを解放できます。

Marshal.FreeHGlobal(lpdwResult); 
+0

それは本当ですか?メモリを解放する方法/方法については、[SendMessageTimeout'(https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952.aspx)のドキュメントを参照してください。 –

+0

おそらくこれがあなたの疑問に答えるでしょうか? http://stackoverflow.com/questions/4949084/how-marshal-freehglobal-works – CharithJ

+0

申し訳ありません。 [this so answer](http://stackoverflow.com/a/19737234/107625)を見ると、返された 'IntPtr'のメモリも解放されていません。私の意見では、呼び出された関数のドキュメンテーションを知らなくても、 'IntPtr'で' FreeHGlobal'を盲目的に呼び出すことはできません。 –