日常工作中,doc文件直接双击后,就能启动word软件,并读取该文档的内容在软件中显示,这都得益于注册表的配置,我们的软件也需要实现这样的功能,该如何写注册表以及写入哪些内容呢?下面的两个函数就能实现这个功能。CheckFileRelation是检查注册表中是否已经将我们期待的文件格式与相应软件关联了;RegisterFileRelation是直接往注册表中写入相关的key和value。

/****************************************************
* 检测文件关联情况
* strExt: 要检测的扩展名(例如: ".txt")
* strAppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")
* 返回TRUE: 表示已关联,FALSE: 表示未关联 ******************************************************/ BOOL CheckFileRelation(const char *strExt, const char *strAppKey)
{
int nRet=FALSE;
HKEY hExtKey;
char szPath[_MAX_PATH];
DWORD dwSize=sizeof(szPath);
if(RegOpenKey(HKEY_CLASSES_ROOT,strExt,&hExtKey)==ERROR_SUCCESS)
{
RegQueryValueEx(hExtKey,NULL,NULL,NULL,(LPBYTE)szPath,&dwSize);
if(_stricmp(szPath,strAppKey)==)
{
nRet=TRUE;
}
RegCloseKey(hExtKey);
return nRet;
}
return nRet;
}
/****************************************************

* 注册文件关联
* strExe: 要检测的扩展名(例如: ".txt")
* strAppName: 要关联的应用程序名(例如: "C:/MyApp/MyApp.exe")
* strAppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")
* strDefaultIcon: 扩展名为strAppName的图标文件(例如: *"C:/MyApp/MyApp.exe,0")
* strDescribe: 文件类型描述 ****************************************************/ void RegisterFileRelation(char *strExt, char *strAppName, char *strAppKey, char *strDefaultIcon, char *strDescribe)
{
char strTemp[_MAX_PATH];
HKEY hKey; RegCreateKey(HKEY_CLASSES_ROOT, strExt, &hKey);
RegSetValue(hKey, "", REG_SZ, strAppKey, strlen(strAppKey) + );
RegCloseKey(hKey); RegCreateKey(HKEY_CLASSES_ROOT, strAppKey, &hKey);
RegSetValue(hKey, "", REG_SZ, strDescribe, strlen(strDescribe) + );
RegCloseKey(hKey); sprintf_s(strTemp, "%s\\DefaultIcon", strAppKey);
RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
RegSetValue(hKey, "", REG_SZ, strDefaultIcon, strlen(strDefaultIcon) + );
RegCloseKey(hKey); sprintf_s(strTemp, "%s\\Shell", strAppKey);
RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
RegSetValue(hKey, "", REG_SZ, "Open", strlen("Open") + );
RegCloseKey(hKey); sprintf_s(strTemp, "%s\\Shell\\Open\\Command", strAppKey);
RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
sprintf_s(strTemp, "%s %%1", strAppName);
RegSetValue(hKey, "", REG_SZ, strTemp, strlen(strTemp) + );
RegCloseKey(hKey);
}

有了这两个函数后,可以实现文档和软件的关联了,但是双击文档后,又是如何读取文档的内容的呢?这里主要是用到了命令行参数,我们需要在CTestApp的InitInstance函数获取命令行参数,如:

BOOL CTestApp::InitInstance()
{
//这里的m_lpCmdLine是CWinApp的成员变量,双击文档时,文档的路径会传给该参数
CString pathName = m_lpCmdLine;
if (pathName != _T(""))
{
//TODO:读取文件、解析文件、呈现文件
}
}

VC++ 实现文件与应用程序关联的更多相关文章

  1. VC 实现文件与应用程序关联(转载)

    转载:http://www.cnblogs.com/RascallySnake/archive/2013/03/01/2939102.html 日常工作中,doc文件直接双击后,就能启动word软件, ...

  2. VC++ 文件和应用程序关联,默认图标不显示问题

  3. windows 上让文件类型和程序关联的批处理程序。

    文件关联工具 地址: https://github.com/wll8/assoc-tool 本工具可以用来为你的便携程序添加文件关联,比如 nodepad2.exe . vscode 或其他图片处理程 ...

  4. Window 注册程序关联后缀文件,双击运行

    一般来说,很多软件都会有自定义后缀的文件,比如.cpp..doc等,那么如果我们想把这些后缀与我们的软件关联起来,如何做呢 #pragma once #include "StdAfx.h&q ...

  5. LaTeX-WinEdt 编辑器和 PDF 文件的 Acrobat 11 程序关联

    WinEdt 编辑器和 PDF 文件的 Acrobat 11 程序关联 CTeX 套装 2.8 版本以后,也就是09年9月以后的版本加入了SumatraPDF程序,将PDF文件与Acrobat程序取消 ...

  6. [转]VC中调用外部exe程序方式

    本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProce ...

  7. VC的文件操作

    各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的.本文将对Visua ...

  8. VC下载文件 + 显示进度条

    在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释: 1.下载线程函数: UINT DownloadFile(LPVOID pParam) { CWn ...

  9. 在VC资源文件中加入声音资源

    本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音. 1.首先用文本编辑器(如记事本)打开资源文件(.rc文件) 在最后加入自己的声音资源,如下IDW WAVE " ...

随机推荐

  1. VS2010 AppCode文件夹问题

    在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...

  2. bug_ _

    java.lang.SecurityException: Not allowed to bind to service I app中加了百度定位功能,大部分手机测试没问题,但有部分手机会定位失败,提示 ...

  3. CSS盒子模型与box-sizing

    今天在学习的时候偶然看到一张图片: 我瞬间瞪大了眼睛:width和height竟然不包括padding和border!! 过去所学知识有问题!在我的印象里,width应该是包含padding和bord ...

  4. 基于Grunt&Mocha 搭建Nodejs自动化单元测试框架(含代码覆盖率统计)

    Introduction Grunt 是一个基于任务的JavaScript 世界的构建工具 Mocha 是具有丰富特性的 JavaScript 测试框架,可以运行在 Node.js 和浏览器中,使得异 ...

  5. 十三、File Translator怎么写

    ---恢复内容开始--- 1. File Translator可以将信息从maya中导入和导出. 2. 创建一个file translator需要从MPxFileTranslator继承. 3. 函数 ...

  6. urlparse

    urlparse模块 urlparse主要是URL的分解和拼接,分析出URL中的各项参数,可以被其他的URL使用,而且只在python2.7中存在,python3中是在urllib包下的urllib. ...

  7. Java获取本机ip和服务器ip

    一.获取服务器IP InetAddress addr = InetAddress.getLocalHost().getHostAddress();//获得本机IP 二.获取客户端本机IP String ...

  8. 完全卸载Oracle11G

    要特别注意删除注册表的这块,如果删错了会导致系统出现问题,而且oracle的安装卸载真的很烦,一旦装错了,卸载不干净就会导致种种的问题无法再次安装,个人建议用360卸载,360卸载完成后会自动检测到无 ...

  9. 获取访问者的IP

    import java.io.Serializable; import java.net.InetAddress; import java.net.UnknownHostException; impo ...

  10. Android启动标记

    1. Task是包含一系列Activity的堆栈, 遵循先进后出原则. 2. Task默认行为: (1) 前提: Activity A和Activity B在同一个应用中. 操作: Activity ...