Можно ли освободить память, выделенную для параметров, когда вызывается SHChangeNotify с параметром SHCNF_FLUSHNOWAIT? - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть следующее объявление для 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 указано, что "Функциядолжен начать доставку уведомлений всем затронутым компонентам, но должен вернуться, как только начнется процесс уведомления ".

Когда я вызываю FreeHGlobal на ptr, следует ли мне беспокоиться об освобождении памяти, которая еще может быть использована где-нибудь, или SHChangeNotify работает с копией строки?

Мои тесты показывают, что мой кодработает, но я не хочу его развертывать и вижу, что проблемы возникнут позже ...

1 Ответ

4 голосов
/ 09 ноября 2011

SHChangeNotify берет копию вашей строки. Вы можете безопасно и действительно должны освободить память, как только вызов SHChangeNotify вернется.

...