上一篇:办公之星控件OA应用开发方案 >>
如何在程序中实现关联指定的文件类型
主页:
Email:
在日常使用电脑的过程中,我们只要双击文件夹中各种形象化的文件图标就可以直接启动相关联的软件来打开该文件(如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);
}
} |
以上代码我在BCB6 + Windows 2000下编译通过。
欢迎大家交流,请支持我的主页:
下一篇:你需要virtual析构函数吗 >>
相关文章:
- · Step By Step 可连接对象与接受器实现
- · ffdff000 处的结构 KPCR
- · 矩形体排样问题
- · Socket传输文件示例(上)
- · Socket传输文件示例(下)
- · 关于在XtremeToolkit2.0环境下使用中文
- · 使用虚列表和自画实现文件夹的缩略图显示
- · 重载赋值运算符
- · 瞎侃编译和解释
- · 用拷贝钩子实现对文件夹的监控
- · sniffer技术原理及应用,包括编程方法和工具使用
- · 如何编程动态改变IE的代理服务器设置, 并且使之马上生效!
- · 用VC6编写注册表管理程序
- · 用VC6编写注册表管理程序(二)
- · 用VC6编写注册表管理程序(三)
- · myicq-1.0a1服务器代码分析(一)
- · 利用鼠标键盘钩子截获密码。
- · myicq-1.0a1服务器代码的一点分析(二)—在线人员管理与内存分配
- · 数据结构学习(C++)续——排序【6】内部排序总结
- · VC下TabCtrl的控制问题解决办法( 原创 )
- · Developing COM Components using VC-ATL(1)
- · 对密码截获工具的防范
- · Developing COM Components using VC-ATL(1-2)
- · 编程本质论
- · 在BCB中实现背景平滑循环滚动
- · 揭开QQ登录窗口的面纱
- · myicq1.0a1服务器代码分析(三)服务器集群
- · 利用C语言编写dll扩展vb功能 c学习笔记(一)
- · CJ60LIB MFC EXTENSION DLL 6.09 FINAL VERSION
- · Developing COM Components using VC-ATL(2)
- · 利用办公之星控件动态生成图表
- · 也谈编程本质
- · Server Strategies -- Programming High Performance WinSock Server
- · Windows CE下的串口通讯类
- · JIURL键盘驱动 1
- · Developing COM Components using VC-ATL(2-2)
- · Developing COM Components using VC-ATL(2-3)
- · 驱动对象 设备对象 设备栈 乱杂谈
