VC++ 实现文件与应用程序关联

日常工作中,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)==0)
        {
            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) + 1);
    RegCloseKey(hKey);

    RegCreateKey(HKEY_CLASSES_ROOT, strAppKey, &hKey);
    RegSetValue(hKey, "", REG_SZ, strDescribe, strlen(strDescribe) + 1);
    RegCloseKey(hKey);

    sprintf_s(strTemp, "%s\\DefaultIcon", strAppKey);
    RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
    RegSetValue(hKey, "", REG_SZ, strDefaultIcon, strlen(strDefaultIcon) + 1);
    RegCloseKey(hKey);

    sprintf_s(strTemp, "%s\\Shell", strAppKey);
    RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
    RegSetValue(hKey, "", REG_SZ, "Open", strlen("Open") + 1);
    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) + 1);
    RegCloseKey(hKey);
}

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

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

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

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

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

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

文件关联工具 地址: https://github.com/wll8/assoc-tool 本工具可以用来为你的便携程序添加文件关联,比如 nodepad2.exe . vscode 或其他图片处理程序,而不仅仅是 sublime text . 使用方法 把要关联的程序比如 nodepad2.exe 拖入本工具的窗口即可进行操作. [x] 添加右键菜单 [x] 关联扩展名 [x] 关联图标 [x] 取消关联扩展名 [x] 取消添加右键菜单 [ ] 图标叠加 设置扩展名 按照以下格式录入 ext.

win7中右击“计算机”点“管理” 则出现“该文件没有与之关联的程序来执行操作

win7中右击"计算机"点"管理" 则出现"该文件没有与之关联的程序来执行操作.请安装一个程序,或者,如果已安装程序,请在'默认程序'控制面板中创建关联." 参考答案: 右健"我的电脑"中的"管理"项,打不开,出现"该文件没有与之关联的程序来执行该操作.请安装一个程序.或者,如果已安装程序,请在"默认程序"控制面板中创建关联." 这是由于应用某些优化软件造成,其中可能

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

WinEdt 编辑器和 PDF 文件的 Acrobat 11 程序关联 CTeX 套装 2.8 版本以后,也就是09年9月以后的版本加入了SumatraPDF程序,将PDF文件与Acrobat程序取消了关联,改用了SumatraPDF程序显示,也就是在WinEdt编辑器的面板上,点击"Acrobat Reader"按钮后用SumatraPDF程序打开关联的PDF文档,这可能涉及到版权啥的原因,在此就不多说了. 我们可能还是习惯使用Acrobat程序查看和标记PDF文档,因此介绍一下如何

所有exe文件程序关联都被默认修改为pdf,的解决方法

一同事的win7电脑,所有exe文件程序关联都被默认修改为pdf,因为win7没有像xp可以修改默认打开程序.修改注册表项也无法恢复,因此摸索出如下变通解决方法: 1.复制原用户桌面,我的文档,收藏夹等文件到其他盘2.用本地管理员账户登录计算机,(登录后exe文件正常),打开用户配置文件,删除原来用户的配置文件3.重新启动计算机,用原用户登录,登录后exe文件恢复正常4.检查原来安装的应用程序是否正常启动,如无法正常启动的需要重新安装

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

本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了<vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess>,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题). 三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实

[转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂.    WinExec 两个参数,前一个指定路径,后一个指定显示方式.    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等.    Cr

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

本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音. 1.首先用文本编辑器(如记事本)打开资源文件(.rc文件) 在最后加入自己的声音资源,如下IDW WAVE "c:\\kav\\sound\\virus.wav" 保存资源文件.  2.在应用程序中要播放声音的地方启动另一线程,用来播放声音:AfxBeginThread((AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL); 3.添加线程回调函数 这里介绍加载

Win10系列:VC++ XML文件解析

XML文件按照元素标记来存储数据,通过遍历这些元素标记可以得到XML文件中所保存的数据.在C++/CX的类库中并未定义用于解析XML文件的类,但C++提供了能解析XML文件的框架和类库,如msxml4.libxml.IXMLDOM和TinyXML等,在使用C++/CX编写应用程序时可以通过C++提供的框架和类库来解析XML文件.TinyXML是一个轻量级解析XML的框架,本节将介绍如何使用此框架来解析一个XML文件. TinyXML框架包含了以下的类和函数,通过使用这些类和函数可以方便地读取一个