问题标签 [shell-namespace-extension]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 管理和缓存 UI 对象
我正在为 Windows 资源管理器编写命名空间扩展。在扩展的上下文中,没有 UI 线程。所以当我创建一个 UI 对象并缓存它以重用它时,我得到了跨线程异常。我理解为什么我会遇到跨线程异常,但我不知道如何解决它。
有没有办法可以创建自己的 UI 线程,然后使用该线程来管理 UI 对象?我认为这将解决问题。
windows - 在 explorer.exe 中重新加载之前加载失败的命名空间扩展
背景
我有一个位于MyComputer 下的Shell 命名空间扩展(使用虚拟文件夹作为其连接点)。可以为我的命名空间扩展创建快捷方式。在这里,我用桌面上的快捷方式显示了我的命名空间扩展。
如果没有安装我的命名空间扩展,我在安装时创建的快捷方式将无法按预期解析。
当我的应用程序启动时,它会将我的命名空间扩展安装到注册表中。当它退出时,它会从注册表中删除命名空间扩展。这对我的应用程序来说是必要的,因为每次运行时加载的代表我的命名空间扩展的 dll 可能会有所不同,具体取决于配置。
问题
当我的应用程序未运行并且 explorer.exe 遇到我的(当前未安装的)命名空间扩展的快捷方式时,它会尝试在注册表中查找 COM 组件(快捷方式包含我的命名空间扩展的 COM 标识符)——我观察到这通过进程监视器。后来,当我的应用程序启动时,我的命名空间扩展按预期添加到“我的电脑”下,但它不起作用——也就是说,尝试浏览它(双击)不能正常工作(什么都不做) . 我通过进程监视器观察到 explorer.exe 没有重新尝试加载我的命名空间扩展。似乎 explorer.exe 记得它未能为我的命名空间扩展加载 COM 组件,因此它不会重试。处于这种状态时的症状是:
快捷方式显示为未解决
命名空间扩展显示在我的电脑下,但双击它不起作用。
- 命名空间扩展未显示在左侧导航面板中
一旦我处于这种状态,我发现解决问题的唯一方法是重新启动 explorer.exe。
问题
有没有办法让 explorer.exe 重新尝试加载我的命名空间扩展,一旦它已经无法加载一次(由于未解决的快捷方式)而无需重新启动 explorer.exe?
一个例子
以下是如何从头开始创建和观察问题的演练。这涉及使用称为Shell Instance Object的“内置”Microsoft 命名空间扩展(而不是我真正的命名空间扩展)。为了简单起见,我使用它来表明它与我的特定命名空间扩展无关。这个示例命名空间扩展所做的只是在“我的电脑”下创建一个图标,该图标将浏览到您的 %TEMP% 目录。
安装命名空间扩展并在“我的电脑”下注册。为此,请在注册表中输入以下内容:
这是一个 .reg 文件,它将为您自动执行该操作:
/li>此时,当您打开资源管理器窗口并浏览“我的电脑”时,您应该会看到“我的命名空间扩展”。浏览它应该会显示您的 %TEMP% 目录文件夹/文件。
通过将“我的命名空间扩展”拖到桌面上,在桌面上创建“我的命名空间扩展”的快捷方式。
从注册表中完全删除命名空间扩展注册。您可以通过手动删除上述密钥或运行以下 .reg 文件来做到这一点:
/li>此时重新启动 explore.exe(或重新启动)。explorer.exe 启动时,它会尝试解析桌面上的快捷方式。这样做时,它会尝试将 COM 组件定位在
HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}
,但无法定位。打开“我的电脑”的资源管理器窗口并观察“我的命名空间扩展”不存在。另请注意,快捷方式显示为未解决。通过重新应用步骤 1 中的注册表更改来重新安装命名空间扩展。
刷新“我的电脑”窗口。此时您将处于有问题的状态,您可以在“我的电脑”下看到命名空间扩展,但尝试浏览它不起作用。
如果此时重新启动 explorer.exe,问题就会消失。这是因为当 explorer.exe 尝试解析快捷方式时,它能够加载命名空间扩展 COM 组件,因为它当前已在注册表中注册。
补充笔记
我真正的命名空间扩展是用 C++ 编写的。
我正在使用SHChangeNotify让命名空间扩展在“我的电脑”下出现/消失,而不需要手动刷新,但这不会导致命名空间扩展尝试重新加载。
也许令人惊讶的是,使用desktop.ini 方法与 .ShellClassInfo 和 CLSID注册的名称空间扩展似乎不会受到此问题的影响。不幸的是,我不能使用这种方法,因为我需要在“我的电脑”下有我的命名空间扩展。
winapi - SHChangeNotify 与 SHCNE_RMDIR 行为在 Windows 7 和 Windows 10 之间不一致
概述
我使用SHChangeNotify
withSHCNE_RMDIR
来通知 shell 已从我的shell 命名空间扩展中删除的文件夹。我的期望是,这将导致其文件夹视图导航到已删除文件夹(或其任何子文件夹)的任何资源管理器(或其他 shell)窗口被导航到已删除文件夹的父文件夹。此预期行为正在 Windows 10 上发生。但是,在 Windows 7 上,这些窗口被导航到已删除的文件夹。
问题
Windows 7 上的这种行为是否是一个错误,和/或我可以做些什么(没有针对 Windows 7 的特殊代码)来获得两个操作系统的相同行为?
重现问题的详细步骤
以下是如何从头开始创建和观察问题的演练。这涉及使用称为Shell Instance Object的“内置”Microsoft 命名空间扩展(而不是我真正的命名空间扩展)。为了简单起见,我使用它来表明它与我的特定命名空间扩展无关。这个示例命名空间扩展所做的只是在“我的电脑”下创建一个图标,该图标将浏览到您的 %TEMP% 目录。
安装命名空间扩展并在“我的电脑”下注册。为此,请在注册表中输入以下内容:
这是一个 .reg 文件,它将为您自动执行该操作:
以下 .reg 文件将允许您轻松删除上述注册表项:
/li>此时,当您打开资源管理器窗口并浏览“我的电脑”时,您应该会看到“我的命名空间扩展”。浏览它应该会显示您的 %TEMP% 目录文件夹/文件。
在您的文件夹中创建一个
%TEMP%
名为FolderToRemove
. 在其中FolderToRemove
创建一个名为subFolder
.打开 3 个资源管理器窗口并浏览到以下位置:
- 我的电脑\我的命名空间扩展
- 我的电脑\我的命名空间扩展\FolderToRemove
- 我的电脑\我的命名空间扩展\FolderToRemove\subFolder
在 Windows 7 上,执行以下 C++ 代码:
/li>执行上述代码后,您会注意到唯一更改的资源管理器窗口是最初导航到
My Computer\My Namespace Extension\FolderToRemove\subFolder
. 请注意,它现在指向My Computer\My Namespace Extension\FolderToRemove
:期望两个资源管理器窗口已更改,以便它们都被导航到
My Computer\My Namespace Extension
(已删除文件夹的父文件夹)。这是预期行为的图像(这是在 Windows 10 上发生的情况):
补充说明
我发现我可以通过在
SHChangeNotify
. 例如:但是,当我在 Windows 10 上执行此代码时,它当然会导致将窗口导航回
My Computer
不希望的位置。如果我采用这种解决方法,我将需要针对不同操作系统的不同代码。
windows-shell - Microsoft 如何为即将推出的 OneDrive On-Demand 功能实施 shell 扩展?
在即将推出的 OneDrive 客户端(目前为内幕)版本中 - 按需功能 Microsoft 引入了一些新的外壳/命名空间扩展。
还有一个显示文件可用性状态的附加列,以及状态栏中的文本。
Microsoft 是否为 OneDrive 同步文件夹或其他一些 shell 接口开发了特殊的 IShellView 实现?他们是如何连接到文件选择更改事件的?
我知道自以前的某些 Windows 版本以来,已删除了对 Column 处理程序扩展的支持。
请指出一些有关开发此类功能的有用资源:自定义列和状态栏扩展(最好使用 C#..)。
c++ - 将自定义横幅添加到命名空间扩展
Windows 资源管理器能够在禁用搜索和索引时显示自定义横幅:
我想在带有自定义消息和自定义链接处理程序的自定义命名空间扩展中显示类似的横幅。是否有我可以实现的命名空间扩展接口允许我提供此功能?我在命名空间扩展文档中搜索了各种术语,但我无法找出要使用的正确术语。
c++ - 如何在 Windows 7 上的 C++ 中为虚拟文件夹创建快捷方式?
我使用的平台是windows 7。我需要为windows 7上的虚拟文件夹创建快捷方式。我使用windows 7 SDK示例在Computer下创建一个虚拟文件夹:
示例项目名称为ExplorerDataProvider
,它定义了 IShellFolder 类的 CLSID:
的定义CFolderViewImplFolder_CreateInstance
是:
和CFolderViewImplFolder
实施IShellFolder2
amd IPersistFolder2
。我在这里找到了用于为打印机创建快捷方式的类似代码:
https ://www.codeproject.com/Articles/596642/Creating-a-shortcut-programmatically-in-Cplusplus
和
https://msdn.microsoft。 com/en-us/library/aa969393.aspx#Shellink_Item_Identifiers
一旦获得 IShellFolder 的类标识符,就可以调用 CoCreateInstance 函数来检索接口的地址。然后您可以调用该接口来枚举文件夹中的对象并检索您正在搜索的对象的项目标识符的地址。最后,您可以在调用 IShellLink::SetIDList 成员函数时使用该地址来创建对象的快捷方式。
我修改了
到
或者
但是 pVirtualFolder 仍然是 NULL,并且打印出“找不到对应的接口”。
我用的时候有什么问题CoCreateInstance
吗?或者我不应该使用这个解决方案?有任何示例代码吗?
c++ - 仅当用户从 Win 7 上的应用程序打开 Windows 资源管理器时,如何显示虚拟文件夹?
--------------------------------第二次更新---------------- --------
我试过了:
这行不通。txt文件中要打印的内容是:00000000000CDEE0 注册dll时只打印一次。之后,无论我浏览虚拟文件夹多少次,打开它,它都不会再进入 DllMain 打印字符串。
我正在使用 Microsoft windows 7.0 SDK 示例( ExplorerDataProvider )在“我的电脑”上创建一个虚拟文件夹,如下所示:
当我打开文件浏览器对话框时,它会显示这个虚拟文件夹。当我从 Microfost office 中单击“另存为”时,会弹出 windows 文件资源管理器对话框并仍然显示此虚拟文件夹。我写了一个 C++ 应用程序,点击“导出”也可以保存文件。它将打开 windows 文件资源管理器对话框,当用户选择目录并单击保存时,它可以保存文件。我的问题是:我希望只有当我使用我的 C++ 程序打开文件对话框时才能显示虚拟文件夹。如果我在我的应用程序之外打开 Windows 资源管理器,则虚拟文件夹是不可见的。我怎么能那样做?似乎一旦我为虚拟文件夹注册了dll,虚拟文件夹就一直存在。
我没有找到类似SetVisible
函数的东西IShellFolder
。
c++ - 虚拟文件夹在 Windows 7 的 CFileDialog 中不可见
-------------------------更新第五次------------------------ --------
现在这个在应用程序 A、stackoverflow 图像上传文件对话框和常规文件夹资源管理器中正常工作。
-------------------------------------------------- ---更新第四次-------------------------------------------- -------------- 添加之后dwAttribs |= SFGAO_SYSTEM;
,现在至少对于应用程序 A,它在文件对话框中按预期工作。但该文件夹在常规文件夹对话框或CWFileDialog
.
----------------------更新第三次------------- ---------------------------- 这是虚拟文件夹的 ISHellFolder 中的代码:
编辑以下代码添加dwAttribs |= SFGAO_FILESYSTEM;
后,在文件夹视图中双击该文件夹时无法浏览该文件夹。但是可以通过在树视图中左键单击它来打开它。
或者
其他代码同中update 2nd
。奇怪的是,在我编辑这些代码之后,CFileDialog
正常使用的应用程序 A(不包装它,未设置m_bPickNonFileSysFoldersMode
为 true)可以按我的预期正常显示所有虚拟文件夹。但是在所有其他应用程序中(包括CWFileDilao
设置m_bPickNonFileSysFoldersMode
为 true 的应用程序仍然无法查看虚拟文件夹。
---------------------------------------更新第二次---------- ----------------
我编写了一个派生自 CFileDialog 的简单类:
然后我称之为:
但是在弹出的对话框中,虚拟文件夹仍然不可见。它的树视图也是不可见的。 - - - - - - - - - - - - - - - - - - - - - 更新 - - - - ---------------------
m_bPickNonFileSysFoldersMode
不是公共类型。我怎么能把它设置为 TRUE ?
通过使用 Microsoft Windows 示例代码,我使用 shell 命名空间扩展在 Windows 7 上安装了一个虚拟文件夹。以下屏幕截图是使用常规文件夹浏览器打开它:
然后我写了一个可以创建文件对话框的项目:
但是,在文件浏览器中,虚拟文件夹是不可见的:
但!当我尝试将屏幕截图上传到 StackOverflow(我使用的网络浏览器是 chrome)时,用于选择文件的文件对话框可以显示虚拟文件夹的树视图(仅树视图):
通过谷歌搜索,似乎 CFileDialog 不支持显示虚拟文件夹,因为它实际上并不存在于系统中。有什么解决方案可以解决这个问题吗?我也试过
也不行。
c++ - 无法获取 Windows 7 C++ 上虚拟文件夹的路径(shell 命名空间扩展相关)
通过使用 Microsoft windows SDK 7.0、explorerDataProvider,我在 windows 7 上安装了一个虚拟文件夹。
当我从应用程序打开文件浏览对话框时,
它还可以显示虚拟文件夹:
但是当我选择文件时,像“零”可以然后点击“打开”,
我试图添加断点
但似乎这个错误发生在里面DoModal()
。
我做了一些研究并修改了虚拟文件夹的代码:
并返回路径GetDisplayNameOf()
但它仍然在应用程序中统计“路径不存在”的错误消息。我在 中添加断点GetDisplayNameOf
,但是当应用程序打开文件浏览对话框时它永远不会触发。但是如果我只是双击“计算机”打开一个普通文件夹,它就会被触发。
“路径不存在”的错误消息似乎不能被弃用或覆盖。有什么方法可以修改虚拟文件夹以返回正确的路径?
更新:我试过IFileDialog
了,我从 MSDN 示例、代码中复制了代码,并添加了断点,看看会发生什么。然而,
当我单击“打开”按钮时,仍然出现“路径不存在,检查路径并重试”的错误消息框。pfd->Show(NULL)
在我单击“打开”按钮后,它永远不会出现。
根据示例代码中的注释,它应该出现hr = pfd->Show(NULL);
并到达下一行。但是错误消息发生在hr = pfd->Show(NULL);
.
更新:
在中IFileDialog
,我尝试了
我也试过
并尝试过
我还尝试在命名空间扩展代码中返回全名:
更新:
这对我有用!