Explorer Namespace Extension-第三方应用中Save的进入方式是什么?

Explorer Namespace Extension- what is the entering method of Save in third party application?

我有一个基于 linking 的命名空间扩展程序(文件夹在本地不存在)。 每当我尝试在使用 ShellExtension 的文件夹下保存文件时,我都会收到错误消息:

C:\folderPath...

Path does not exist.

Check the path and try again.

我试图找到资源管理器正在调用的入口点,以便在它尝试保存之前创建文件夹,但我的所有尝试似乎都失败了。 我可以通过“OnCommonDialogOKButtonClicked”方法上的断点捕获打开事件。

也许这是一个浏览器错误,但我不确定。

我在一些与 ShellExtension 关联的外部 link 上发现了以下信息: linkshellextension 我引用:

Unfortunatley this is a bug in Explorer, and I don't have a clue how to come around this in explorer. If you start the symlink to an .exe from a command prompt it works fine, and even third party explorers like SpeedCommander can do this, but explorer seems to have a limitation Does anybody know the registry hack to enable this in explorer.exe? Drop me a line.

切入点在哪里? 这是资源管理器的不良设计吗? 我必须在导航时创建文件夹才能解决问题?

只要单击保存按钮,文件夹就必须在本地创建并存在。 我猜你正在使用 EZNamespace(根据你提供的方法)——在内部,它是在文件对话框 destroyed 之后调用的。 这是他们的糟糕设计。

他们建议在导航时创建所有文件夹 - 但我找到了另一种方法。

它发生的原因是因为当对话框假设关闭时,路径应该存在(文件对话框通常是用一个选项创建的,如果打开文件,则显示 "PATHMUSTEXIST" 或 "FILEMUSTEXIST"对话框 - 这在第 3 方应用程序创建对话框后无法更改。

我建议尝试在您的自定义虚拟文件夹中实现 IObjectWithSite,这是一个示例:

http://blogs.msdn.com/b/winsdk/archive/2015/03/24/how-to-register-for-file-dialog-notifications-from-shell-namespace-extension.aspx

只需将所有 "open" 更改为 "save" 即可。

最终,它的作用是挂钩并注册该特定对话框的 IFileDialogEvents。然后你可以控制它周围的一些动作(例如,使用 "OnFileOk" 而不是你上面的方法,它允许你取消 "Ok" 与你的验证,并且还得到实际的 IShellItem 选择。

每当调用 "OnFolderChange" 时,您都可以创建文件夹,并删除旧文件夹: https://msdn.microsoft.com/en-us/library/windows/desktop/bb775880(v=vs.85).aspx

只要确保在最终单击 "ok" 时不要销毁它,您可以在销毁对话框时删除该文件夹(因此,如果用户决定取消,您的文件夹中将不会有垃圾文件夹文件系统)。

这应该在这里完成:

if (m_fileOpenDialog != NULL)

        {

            m_fileOpenDialog->Unadvise(m_cookie);

            m_fileOpenDialog->Release();

            m_fileOpenDialog = NULL;

            m_cookie = 0;

        }

如果您按下 "ok" 并且不要删除文件夹,请确保保留标志。

如果文件夹存在,文件将在指定的文件系统中创建(您必须确保您的虚拟文件的 GetDisplayName 将指向真实的文件系统路径。

另一个重要说明,每当调用 "OnFileOk" 时,您的文件 不会 在那里(因为它在第 3 方应用程序的主线程上运行)。您将不得不等待它完成将自身写入文件系统,然后根据需要处理它。

由于这个 post 是旧的,如果需要更多具体示例,请点击评论,我会提供。

祝你好运。