在程序中实现关联指定的文件类型

来源:互联网 发布:小学生读英语软件下载 编辑:程序博客网 时间:2024/05/18 13:06
 在日常使用电脑的过程中,我们只要双击文件夹中各种形象化的文件图标就可以直接启动相关联的软件来打开该文件(如Word文档),而不需要用户关心该用什么软件来打开此类文件。这样做不但方便了用户,同时也增加了软件的主动性及灵活性。

  软件的这种功能是如何实现的呢?接下来我就为大家介绍如何在Windows环境下为自己开发的软件增加这样的功能。“玩”过Windows注册表的朋友应该都会发现在注册表的HKEY_CLASSES_ROOT主键中有很多以“.”开头的子项(如.txt),而这些子项就是最关键的开始。下面我就以文本文件(*.txt)为例来进行说明。

  打开菜单“开始->运行...”,输入“regedit”来启动注册表编辑器。然后打开HKEY_CLASSES_ROOT主键找到“.txt”子项,点击后就可以在右边查看该项的有内容。在这里我们主要关心的是“(默认)”这一项,因为它的内容就是我们要找的下一个主键项。一般情况下该键值为“txtfile”,接下来继续在HKEY_CLASSES_ROOT主键中找到“txtfile”子项,双击打开该项后会出现多个子项,下面说明主要的子项的用途:

txtfile- DefaultIcon(显示的文件图标)- shell- Open- Command(用于打开该类型文件的程序路径)- Print- Command(用于打印该类型文件的程序路径)

  有了这些信息后,只要我们在软件中修改或建立这些相关的注册表项及键值就可以实现检测、修改(新增)各种文件类型的关联了。

下面是我编写的两个函数:
bool CheckFileRelation(AnsiString, AnsiString)
void ReGISterFileRelation(AnsiString, AnsiString, AnsiString, AnsiString, AnsiString)

分别用于实现检测和修改(新增)文件关联的功能,源代码如下:

//---------------------------------------------------------------------------// 检测文件关联情况// ExeName: 要检测的扩展名(例如: ".txt")// AppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")// 返回true: 表示已关联,false: 表示未关联bool __fastcall CheckFileRelation(AnsiString ExtName, AnsiString AppKey){TRegistry *pReg = new TRegistry();pReg->RootKey = HKEY_CLASSES_ROOT; // 打开主键// 在检测到本程序不是默认的文件关联时,请用户确认该重新关联操作pReg->OpenKey(ExtName, true);if (pReg->ReadString("") != AppKey){pReg->CloseKey();return false;}pReg->CloseKey();return true;}//---------------------------------------------------------------------------// 注册文件关联// ExeName: 要检测的扩展名(例如: ".txt")// AppName: 要关联的应用程序名(例如: "C:/MyApp/MyApp.exe")// AppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")// Icon: 扩展名为ExeName的图标文件(例如: "C:/MyApp/MyApp.exe, 1")// Describe: 文件类型描述void __fastcall RegisterFileRelation(AnsiString ExtName, AnsiString AppName,AnsiString AppKey, AnsiString Icon, AnsiString Describe){try{TRegistry *pReg = new TRegistry();pReg->RootKey = HKEY_CLASSES_ROOT; // 打开主键// 新建/打开以文件扩展名为名的项,并写入数据pReg->OpenKey(ExtName, true);pReg->WriteString("", AppKey);pReg->CloseKey();pReg->OpenKey(AppKey, true);pReg->WriteString("", Describe);pReg->CloseKey();pReg->OpenKey(AppKey + "//DefaultIcon", true);pReg->WriteString("", Icon);pReg->CloseKey();pReg->OpenKey(AppKey + "//Shell", true);pReg->WriteString("", "Open");pReg->CloseKey();pReg->OpenKey(AppKey + "//Shell//Open//Command", true);pReg->WriteString("", AppName + " %1");pReg->CloseKey();delete pReg;}catch(...){MessageBox(NULL, "注册文件关联时发生错误", "注意", MB_OK|MB_ICONWARNING);}}