Как вызвать SHChangeNotify из C # без ошибки 14007 - PullRequest
2 голосов
/ 08 ноября 2011

Я пишу код, который может обновлять файлы (как необычно и увлекательно!). Когда файл был обновлен, мне нужен проводник Windows, чтобы снова вызывать расширения наложения, чтобы у меня всегда были правильные наложения на файлы. Я подумал, что сделаю это с некоторой хитростью p / invoke (смотря, как это делает TortoiseSVN), но я всегда получаю ошибку 14007 и не могу найти причину. Это код:

IntPtr ptr = Marshal.StringToHGlobalUni(FullName);
Shell.SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH | SHCNF_FLUSH, ptr, IntPtr.Zero);
Win32Exception w = new Win32Exception(Marshal.GetLastWin32Error());
LOG.ErrorFormat("Error {0} calling SHChangeNotify : {1}", w.NativeErrorCode, w.Message);
Marshal.FreeHGlobal(ptr)

Полное имя - путь к файлу, который был обновлен. Я получаю следующую ошибку:

Error 14007 calling SHChangeNotify : The requested lookup key was not found in any active activation context

Что я здесь не так делаю?

К вашему сведению:

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

SHCNE_UPDATEITEM = 0x00002000
SHCNF_PATH = SHCNF_PATHW = 0x0005
SHCNF_FLUSH = 0x1000

1 Ответ

6 голосов
/ 08 ноября 2011

В документации для SHChangeNotify не упоминается, что код "последней ошибки" Win32 установлен на сбой.Любое значение, возвращаемое GetLastError, не имеет смысла.

...