试图“模拟”文档文件夹

时间:2016-01-10 06:51:40

标签: windows vb6 executable virtualization

我是第三方,我想开始第一方应用程序并以某种方式虚拟化文档文件夹,我将决定该位置。
第一个应用程序不会触及真正的“我的文档”文件夹,而是将文件保存在我要设置的位置。 我不想更改个人文件夹的注册表项,我只想为此应用程序。

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

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

谢谢! Yanick

2 个答案:

答案 0 :(得分:0)

当然,您可以使用文本文件(或程序)。 MS很容易。

这是有人引用我的帖子,他直接引用了Raymond Chen,

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

使用Shell实例对象创建Shell扩展  雷蒙德陈  微软公司

2000年2月

摘要:传统的shell命名空间扩展需要实现  COM进程内服务器。 Shell实例对象允许您创建  简单的shell扩展,无需编写任何代码。这个  文章描述了shell实例对象和shell命令对象的方式  用于轻松部署简单的shell扩展。 (5页打印)

内容  什么是Shell命名空间扩展?  什么是Shell实例对象?  可以创建为Shell实例对象的Shell对象  怎么样的例子?  Shell命令对象  结论

什么是Shell命名空间扩展?  Shell命名空间扩展允许您创建"虚拟文件夹"在里面  贝壳。例如,桌面上的“回收站”图标不是实际的  文件系统目录,而是表示项目的集合  由回收站shell扩展维护。

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

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

什么是Shell实例对象?  shell实例对象是由。提供的一种特殊的shell扩展 shdocvw.dll组件。而传统的shell扩展需要DLL  为了实现该对象,shell实例对象将检索它的所有内容  需要从注册表中了解。

shell如何创建shell实例对象

1 .. shdocvw.dll组件因注册为而加载  shell实例对象的InProcServer32。

2 ..当要求shdocvw.dll创建一个对象时,它不会  识别,它检查注册表项是否有名为Instance的子项。如果找到,  它读取该子键的CLSID值并将该CLSID传递给  CoCreateInstance函数。 (由于缺乏一个更好的术语,让我们称之为  "主机"对象。)

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

4 ..最后,shdocvw.dll返回现在初始化的主机对象作为  shell实例对象。  可以创建为Shell实例对象的Shell对象  有两个shell对象支持作为shell的宿主对象  实例对象,即Shell链接对象和Shell文件夹快捷方式  对象

这两个对象都支持IPersistPropertyBag接口,所以你可以  使用InitPropertyBag方法初始化它们。 (事情就这样发生了  这两个对象也支持IPersistStream,但是从a初始化快捷方式  注册表流更麻烦。)

您在注册表中提供的属性包描述了该目标  shell链接或shell文件夹快捷方式对象。有三种支持的表格  这个属性包。

定位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>"

如何举例?  这是在其中创建Fonts文件夹图标的注册副本  控制面板:

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}已在控制中注册  Panel命名空间,Fonts文件夹快捷方式安装在控制面板中。

让我们一步一步地浏览此注册表项。

a .. GUID {D20EA4E1-3957-11D2-A40B-0C5020524152}是由  运行Platform SDK中的uuidgen程序。当然,当你  创建自己的实例对象,你应该运行uuidgen并使用自己的实例  GUID。还提供了名称空间中显示的图标的名称  这里。

b ..当用户将鼠标悬停在屏幕上时,会显示可选的InfoTip字符串  图标。

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

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

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

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

g .. InitPropertyBag键表示文件夹快捷方式  使用IPersistPropertyBag接口初始化。里面的两个值  属性包指定目标是子目录&#34;字体&#34;在里面  特殊文件夹0x0024,即CSIDL_WINDOWS。  Shell命令对象  另一种类型的shell扩展对象是双击时的图标  运行一个命令。这也可以在不必编写COM的情况下创建  服务器。例如,以下是“我的网络”使用的命令对象  放置文件夹:

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实例对象的差异:

a ..没有InProcServer32键。

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

c ..我们有一个Instance密钥而不是Shell密钥,它具有相同的密钥  结构作为编译键。 &#34;开放&#34;动词是默认动作  双击。您还可以创建其他动词,这些动词将出现在  上下文菜单。例如,Internet Explorer图标会创建自定义谓词  打电话给#34;打开主页。&#34;  可以在Platform SDK中找到有关Shell密钥结构的详细信息  MSDN在线图书馆的主题标题&#34;扩展  上下文菜单&#34;  (http://msdn.microsoft.com/library/psdk/shellcc/shell/shell_basics/context.h  商标)。

结论  Shell实例对象和shell命令对象允许您部署简单  具有最少工作量的shell扩展。例如,你可能  在控制面板文件夹中创建一个命令对象,名为&#34;疑难解答,&#34;  它运行一个故障排除程序。或者您可以创建一个shell实例  承载系统管理集合的文件夹快捷方式的对象  共享网络服务器上的工具。 Shell实例对象和shell命令  对象允许您轻松部署这些类型的shell扩展。

答案 1 :(得分:0)

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