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

 在日常使用电脑的过程中,我们只要双击文件夹中各种形象化的文件图标就可以直接启动相关联的软件来打开该文件(如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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值