2011-11-08 15 views
1

私はファイルを更新できるコードを書いています(珍しくてエキサイティングです)。ファイルが更新されたら、Windowsエクスプローラでオーバーレイ拡張機能を再度呼び出す必要があります。そのため、ファイル上に常に正しいオーバーレイが表示されます。私はいくつかのp/invokeトリッキー(TortoiseSVNがそれをやっているのを見て)でこれを行うと思っていましたが、私はいつもエラー14007を得て、なぜそれを見つけることができません。これはコードですエラーなしでC#からSHChangeNotifyを呼び出す方法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 

私はここで間違っていますか?

FYI:

[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 

答えて

5

The documentation for SHChangeNotifyは、Win32 "最後のエラー" コードが失敗した場合に設定されていることを言及していません。 GetLastErrorによって返される値は無意味です。

+0

ありがとうございます!私はあなたのブログを熱狂しています。あなたからの回答がありがたいです。 SHChangeNotifyの間違った宣言があるように見えます。コールがXPマシンに何の影響も与えないので、私はGetLastErrorを呼び出すと、なぜオーバーレイが更新されないのかというヒントが得られるはずです。私はあなたが素晴らしいと思っています! ありがとうございました –

+0

私はSHChangeNotifyへの不完全なパスを与えました(私はドライブレターが不足していました...これはここでは非常に便利です)...ああ! –

関連する問題