2

私はファイルを更新できるコードを書いています (なんて珍しく、エキサイティングなことでしょう!)。ファイルが更新されたら、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)

Fullname は、更新されたファイルのパスです。次のエラーが表示されます。

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
4

1 に答える 1

6

のドキュメントにSHChangeNotifyは、Win32の「最後のエラー」コードが失敗時に設定されるとは記載されていません。によって返される値GetLastErrorは無意味です。

于 2011-11-08T14:14:06.647 に答える