2

SHChangeNotify に対して次の宣言があります。

[DllImport("Shell32.dll")]
public static extern void SHChangeNotify(HChangeNotifyEventID wEventId, HChangeNotifyFlags uFlags, IntPtr dwItem1, IntPtr dwItem2);

次のコードは安全ですか?

IntPtr ptr = Marshal.StringToHGlobalUni(@"C:\foo\bar.txt");
Shell.SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH | SHCNF_FLUSHNOWAIT, ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);

SHCNF_FLUSHNOWAIT のドキュメントには、「関数は、影響を受けるすべてのコンポーネントへの通知の配信を開始する必要がありますが、通知プロセスが開始されるとすぐに戻る必要があります」と記載されています。

ptr で FreeHGlobal を呼び出すとき、まだどこかで使用できるメモリを解放することを心配する必要がありますか?それとも、SHChangeNotify は文字列のコピーに対して機能しますか?

私のテストでは、コードが機能していることを示していますが、それをデプロイして、後で問題が発生するのを見たくありません...

4

1 に答える 1

4

SHChangeNotify文字列のコピーを取ります。SHChangeNotify呼び出しが戻るとすぐに、安全に、そして実際にメモリを解放する必要があります。

于 2011-11-08T21:56:08.480 に答える