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 は文字列のコピーに対して機能しますか?
私のテストでは、コードが機能していることを示していますが、それをデプロイして、後で問題が発生するのを見たくありません...