Explorer命名空间扩展 - 在第三方应用程序中保存的输入方法是什么?

时间:2015-03-12 11:32:31

标签: c# winapi shell-extensions

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

  

C:\ folderPath ...

     

路径不存在。

     

检查路径,然后重试。

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

也许这是一个探险家的错误,但我不确定。

我在一些与ShellExtension相关的外部链接上找到了以下信息: linkshellextension我引用:

  

Unfortunatley这是资源管理器中的一个错误,我不知道如何在资源管理器中解决这个问题。   如果从命令提示符启动符号链接到.exe它可以正常工作,甚至像SpeedCommander这样的第三方探险家也可以这样做,但是探险家似乎有一个限制   有没有人知道注册表黑客在explorer.exe中启用它?请给我留言。

入口点在哪里? 这是一个糟糕的探险家设计? 我必须在导航时创建文件夹以解决问题吗?

1 个答案:

答案 0 :(得分:1)

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

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

它发生的原因是因为当对话框想要关闭时,路径应该存在(文件对话框通常使用一个选项来创建" PATHMUSTEXIST"或" FILEMUSTEXIST" in打开文件对话框的情况 - 在第三方应用程序创建对话框后无法更改。

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

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

只需改变所有"打开"到"保存"它会起作用。

最终它的作用是,它为该特定对话框挂钩并注册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;

        }

如果按下"确定&#34>,请务必留一个标记。而不是删除文件夹。

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

另一个重要的注意事项,每当" OnFileOk"如果被调用,你的文件将(因为它在第三方应用程序的主线程上运行)。你将不得不等待它完成自己写入文件系统,然后如果你想要处理它。

由于这篇文章已经过时了,如果需要更具体的例子,只需点击评论即可供应。

祝你好运。