c# - 如何从 C# 调用 SHChangeNotify 而不会出现错误 14007

标签 c# pinvoke shell32

我正在编写可以更新文件的代码(多么罕见和令人兴奋!)。更新文件后,我需要 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

最佳答案

The documentation for SHChangeNotify没有提到 Win32“最后一个错误”代码是在失败时设置的。 GetLastError 返回的任何值都是无意义的。

关于c# - 如何从 C# 调用 SHChangeNotify 而不会出现错误 14007,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8051674/

相关文章:

c# - 来自具有最佳性能的 C++ 应用程序的 API

c# - 查询字符串 SQL 错误

c# - 部署时 ASP.net CS1061 编译错误

c# - 从 C 函数编码 LPWSTR *

c# - 再次引用shell32,C# Visual Studio

windows - shell32.dll : access violation during GetOpenFileName new thread

c++ - 设备浏览问题

c# - 处理 ViewModels 和 CanExecute 处理程序

c# 将 DataGridView 保存到 Xml 文件

c# - 编译到 AnyCpu 时 LoadLibrary 不起作用