正在尝试 'emulate' 一个文件夹

Trying to 'emulate' a document folder

我是第 3 方,我想启动第 1 方应用程序并以某种方式虚拟化我决定位置的文档文件夹。
第一个应用程序不会触及真正的 'my document' 文件夹,而是将文件保存在我设置的位置。 我不想更改个人文件夹的注册表项,我只想为这个应用程序更改它。

我做了一些研究,但没有找到类似的东西。如果没有虚拟机,这可能吗?我会尝试在 VB6 中工作,我想在 xp 和 win7 上测试一些东西。这是关于游戏的重新设计,我希望这个人能够拥有我的程序,并且在 PC 上安装的原始游戏没有 'my document' 中的配置文件夹冲突。

我应该提到我无法向它传递参数,因为我已经通过第二方可执行文件启动第一方应用程序。

谢谢! 亚尼克

当然可以,使用文本文件(或程序)。 MS 让一切变得简单。

有人引用我的post,直接引用陈峰

http://www.pcreview.co.uk/threads/re-create-system-folder.522854/

使用 Shell 实例创建 Shell 扩展 Objects 陈峰 微软公司

2000 年 2 月

总结:传统的 shell 命名空间扩展需要实现 COM in-process 服务器的。 Shell 实例 objects 允许您创建 简单的 shell 扩展,无需编写一行代码。这个 文章描述了 shell 实例 objects 和 shell 命令 objects 如何可以 用于轻松部署简单的 shell 扩展。 (打印 5 页)

内容 什么是 Shell 命名空间扩展? 什么是 Shell 实例 Object? Shell Objects 可以创建为 Shell 实例 Objects 举个例子怎么样? Shell 命令 Objects 结论

什么是 Shell 命名空间扩展? Shell 命名空间扩展允许您在 shell。例如,桌面上的回收站图标并不是一个实际的 文件系统目录,而是表示 collection 个项目,即 由回收站 shell 扩展维护。

有关创建 shell 命名空间扩展的详细信息可以在平台中找到 MSDN 在线图书馆的 SDK 部分 (http://msdn.microsoft.com/library/psdk/shellcc/shell/shell_adv/namespace.ht 米).

编写一个 shell 命名空间扩展可能是一个相当大的考验。幸运的是, shell 提供了一种简单的方法来创建某些类型的简单 shell 命名空间 扩展,正如本文将展示的那样。

什么是 Shell 实例 Object? shell 实例 object 是一种特殊的 shell 扩展,由 shdocvw.dll 组件。而传统的 shell 扩展需要 DLL 实现 object,一个 shell 实例 object 检索它的所有内容 需要从注册表中知道。

shell 如何创建 shell 实例 object

1.. shdocvw.dll组件是通过注册为加载的 shell 实例 object.

的 InProcServer32

2.. 当要求 shdocvw.dll 创建一个 object 时,否则它不会 recognize,它会检查名为 Instance 的子项的注册表项。如果找到, 它读取该子项的 CLSID 值并将该 CLSID 传递给 CoCreateInstance 函数。 (由于缺乏更好的术语,我们称其为 "host" object.)

3.. 接下来,shdocvw.dll 查找名为 InitPropertyBag 的 Instance 子项 或初始化流。如果找到,它会创建一个 IPropertyBag 或 IStream (相应地)基于注册表项的内容并将其传递给 IPersistPropertyBag::Load 或 IPersistStream::Load 方法(相应地)。

4.. 最后,shdocvw.dll returns now-initialized host object 作为 shell 实例 object。 Shell Objects 可以创建为 Shell 实例 Objects 有两个 shell object 支持作为 shell 的主机 object 实例 object,即 Shell link object 和 Shell 文件夹快捷方式 object.

这两个 object 都支持 IPersistPropertyBag 接口,因此您可以 使用 InitPropertyBag 方法初始化它们。 (恰巧 objects 也支持 IPersistStream,但是从 注册表流要麻烦得多。)

您在注册表中提供的 属性 包描述了目标 shell link 或 shell 文件夹快捷方式 object。支持三种形式 对于这个 属性 包。

针对 shell 特殊文件夹

InitPropertyBag
 TargetSpecialFolder=REG_SZ:"<special folder number>"

请注意,这是一个 REG_SZ 注册表值,尽管它代表一个 整数。支持十进制和十六进制表示法。

针对 shell 特殊文件夹中的目录

InitPropertyBag
 TargetSpecialFolder=REG_SZ:"<special folder number>"
 Target=REG_SZ:"<subdirectory name>"

子目录名称可以包含嵌入的反斜杠。

通过显式路径定位目录

 InitPropertyBag
 Target=REG_SZ:"<full path to target directory>"

举个例子怎么样? 这是在中创建字体文件夹图标的注册副本 控制面板:

HKEY_CLASSES_ROOT
 CLSID
 {D20EA4E1-3957-11D2-A40B-0C5020524152}=REG_SZ:"Fonts"
 InfoTip=REG_SZ:"Displays and manages fonts on your computer"
 DefaultIcon=REG_EXPAND_SZ:"%SystemRoot%\system32\main.cpl,9"
 InProcServer32=REG_EXPAND_SZ:"%SystemRoot%\system32\shdocvw.dll"
 ThreadingModel=REG_SZ:"Apartment"
 ShellFolder
 Attributes=REG_DWORD:0x60000000
 WantsFORPARSING=REG_SZ:""
 Instance
 CLSID=REG_SZ:"{0AFACED1-E828-11D1-9187-B532F1E9575D}"
 InitPropertyBag
 TargetSpecialFolder=REG_SZ:"0x0024"
 Target=REG_SZ:"Fonts"

因为{D20EA4E1-3957-11D2-A40B-0C5020524152}注册在Control 面板命名空间,字体文件夹快捷方式安装在控制面板中。

让我们逐步了解这个注册表项。

a.. GUID {D20EA4E1-3957-11D2-A40B-0C5020524152} 由生成 运行在 Platform SDK 中找到 uuidgen 程序。当然,当你 创建你自己的实例 objects,你应该 运行 uuidgen 并使用你自己的 GUID。还提供了出现在名称空间中的图标名称 这里。

b.. 当用户将鼠标悬停在 图标。

c.. DefaultIcon 字符串提供图标的名称和图标索引 显示此项目。

d.. InProcServer32 密钥必须设置为 shdocvw.dll 文件,并且 线程模型必须设置为单元。

e.. ShellFolder 键将属性设置为 SFGAO_ 的 collection 值,我们希望将其应用于文件夹快捷方式。 SFGAO_FOLDER 标志 必须始终设置。因为目标是文件系统文件夹,所以 SFGAO_FILESYSTEM flag也在Attributes中设置,WantsFORPARSING 值设置为空字符串。 (如果目标不是文件系统文件夹, 不应创建 WantsFORPARSING 值。)

f.. Instance 键将 CLSID 值设置为字符串表示形式 CLSID_FolderShortcut。这表明 object 实例应该创建 文件夹快捷方式。

g..InitPropertyBag键表示文件夹快捷方式将是 使用 IPersistPropertyBag 接口初始化。里面的两个值 属性包指定目标是"Fonts"中的子目录 特殊文件夹 0x0024,即 CSIDL_WINDOWS。 Shell 命令 Objects 另一种 shell 扩展 object 是一个图标,当 double-clicked 运行s 一个命令。这也可以在无需编写 COM 的情况下创建 服务器。例如,这是我的网络使用的命令 object 地点文件夹:

HKEY_CLASSES_ROOT
 CLSID
 {D4480A50-BA28-11d1-8E75-00C04FA31A86}=REG_SZ:"Add Network Place"
 InfoTip=REG_SZ:"Connects to shared folders, Web folders, and FTP
 sites."
 DefaultIcon=REG_EXPAND_SZ:"%SystemRoot%\System32\netplwiz.dll,-107"
 ShellFolder
 Attributes=REG_DWORD:0x00000000
 Shell
 Open
 Command=REG_EXPAND_SZ:"rundll32 ..."

这个注册表项的大部分应该看起来很熟悉,所以我只会突出显示 与 shell 实例 objects:

的区别

a.. 没有 InProcServer32 键。

b.. ShellFolder 键的属性应省略 SFGAO_FOLDER 标记,因为该项目不是文件夹。

c.. 我们有一个 Shell 键,而不是 Instance 键,它具有相同的 结构作为 progid 键。 "Open" 动词是 double-clicking。您还可以创建其他动词,这些动词将出现在 上下文菜单。例如,Internet Explorer 图标创建一个自定义动词 叫做 "Open Home Page." 有关 Shell 键结构的详细信息,请参见 Platform SDK 主题标题“扩展”下的 MSDN Online Library 部分 上下文菜单” (http://msdn.microsoft.com/library/psdk/shellcc/shell/shell_basics/context.h tm).

结论 Shell 实例 objects 和 shell 命令 objects 让您部署简单 shell 工作量最少的扩展。例如,您可能 在名为 "Troubleshoot," 的控制面板文件夹中创建命令 object 运行 是一个故障排除程序。或者您可以创建一个 shell 实例 object 托管系统管理 collection 的文件夹快捷方式 共享网络服务器上的工具。 Shell 实例 objects 和 shell 命令 objects 允许您轻松部署这些类型的 shell 扩展。

我的解决方案是使用十六进制编辑器搜索可执行文件并将其手动编辑到另一个文件夹。当然,我必须选择路径中数量或字符较少或相等的文件夹。 谢谢大家