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

 #pragma once

 #include "StdAfx.h"

 class CRegExtension
{
public:
CRegExtension();
~CRegExtension();
void SetExtension( LPCTSTR szExtension );
void SetShellOpenCommand( LPCTSTR szShellOpenCommand );
void SetDocumentShellOpenCommand( LPCTSTR szDocumentShellOpenCommand );
void SetDocumentClassName( LPCTSTR szDocumentClassName );
void SetDocumentDefaultIcon( LPCTSTR szDocumentDefaultIcon );
BOOL SetRegistryValue(HKEY hOpenKey, LPCTSTR szKey, LPCTSTR szValue, LPCTSTR szData);
BOOL RegSetExtension(void);
BOOL RegSetDocumentType(void);
BOOL RegSetAllInfo(void);
void RegisterFileAndProgram(); private:
CStdString m_csExtension;
CStdString m_csShellOpenCommand;
CStdString m_csDocumentShellOpenCommand;
CStdString m_csDocumentClassName;
CStdString m_csDocumentDefaultIcon;
CStdString m_csDocumentDescription;
};
 #include "StdAfx.h"
#include "RegExtension.h" CRegExtension::CRegExtension()
{ } CRegExtension::~CRegExtension()
{ } void CRegExtension::SetExtension( LPCTSTR szExtension )
{
m_csExtension = szExtension;
}
void CRegExtension::SetShellOpenCommand( LPCTSTR szShellOpenCommand )
{
m_csShellOpenCommand = szShellOpenCommand;
}
void CRegExtension::SetDocumentShellOpenCommand( LPCTSTR szDocumentShellOpenCommand )
{
m_csDocumentShellOpenCommand = szDocumentShellOpenCommand;
}
void CRegExtension::SetDocumentClassName( LPCTSTR szDocumentClassName )
{
m_csDocumentClassName = szDocumentClassName;
}
void CRegExtension::SetDocumentDefaultIcon( LPCTSTR szDocumentDefaultIcon )
{
m_csDocumentDefaultIcon = szDocumentDefaultIcon;
} BOOL CRegExtension::SetRegistryValue(HKEY hOpenKey, LPCTSTR szKey, LPCTSTR szValue, LPCTSTR szData
){
// validate input
if( !hOpenKey || !szKey || !szKey[] ||
!szValue || !szData ){
::SetLastError(E_INVALIDARG);
return FALSE;
}
BOOL bRetVal = FALSE;
DWORD dwDisposition;
DWORD dwReserved = ;
HKEY hTempKey = (HKEY);
// length specifier is in bytes, and some TCHAR
// are more than 1 byte each
DWORD dwBufferLength = lstrlen(szData) * sizeof(TCHAR);
// Open key of interest
// Assume all access is okay and that all keys will be stored to file
// Utilize the default security attributes
if( ERROR_SUCCESS == ::RegCreateKeyEx(hOpenKey, szKey, dwReserved,
(LPTSTR), REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, ,
&hTempKey, &dwDisposition) ){ // dwBufferLength must include size of terminating nul
// character when using REG_SZ with RegSetValueEx function
dwBufferLength += sizeof(TCHAR); if( ERROR_SUCCESS == ::RegSetValueEx(hTempKey, (LPTSTR)szValue,
dwReserved, REG_SZ, (LPBYTE)szData, dwBufferLength) ){
bRetVal = TRUE;
}
}
// close opened key
if( hTempKey ){
::RegCloseKey(hTempKey);
}
return bRetVal;
} BOOL CRegExtension::RegSetExtension(void)
{
if( m_csExtension.IsEmpty() )
{
return FALSE;
}
CStdString csKey = CStdString(_T(".")) + m_csExtension;
SetRegistryValue(HKEY_CLASSES_ROOT, csKey.GetData(), _T(""), m_csDocumentClassName.GetData());
if( !m_csShellOpenCommand.IsEmpty() )
{
csKey += _T("\\shell\\open\\command");
SetRegistryValue(HKEY_CLASSES_ROOT, csKey.GetData(), _T(""), m_csShellOpenCommand.GetData());
}
return TRUE;
} BOOL CRegExtension::RegSetDocumentType(void)
{
if( m_csDocumentClassName.IsEmpty())
{
return FALSE;
}
CStdString csKey = m_csDocumentClassName;
SetRegistryValue(HKEY_CLASSES_ROOT, csKey.GetData(), _T(""), m_csDocumentDescription.GetData());
// DefaultIcon
if( !m_csDocumentDefaultIcon.IsEmpty() )
{
csKey = m_csDocumentClassName;
csKey += _T("\\DefaultIcon");
SetRegistryValue(HKEY_CLASSES_ROOT, csKey.GetData(), _T(""), m_csDocumentDefaultIcon.GetData());
}
// shell\open\command
if( !m_csShellOpenCommand.IsEmpty() )
{
csKey = m_csDocumentClassName;
csKey += _T("\\shell\\open\\command");
SetRegistryValue(HKEY_CLASSES_ROOT, csKey.GetData(), _T(""), m_csShellOpenCommand.GetData());
}
return TRUE;
} BOOL CRegExtension::RegSetAllInfo(void)
{
RegSetExtension();
RegSetDocumentType();
return TRUE;
} void CRegExtension::RegisterFileAndProgram()
{
////一个应用程序与多个文件后缀关联////
#define strExternsionLength 1
LPCTSTR strExtension[] =
{
_T("myproc")
};
//CGCFileTypeAccess TheFTA;
TCHAR szProgPath[MAX_PATH * ];
//获取程序路径
::GetModuleFileName(NULL, szProgPath, sizeof(szProgPath)/sizeof(TCHAR));
CStdString csTempText;
for(int i = ; i < strExternsionLength; ++i)
{
//设置程序需要关联的后缀名,如"txt" "doc" 等
SetExtension(strExtension[i]);
csTempText.Format(_T("\"%s\" %s"),szProgPath,_T("\"%1\""));
SetShellOpenCommand(csTempText.GetData());
SetDocumentShellOpenCommand(csTempText.GetData());
//设置注册表中文件类的别名,例如可以是程序名称:MyProc.exe
SetDocumentClassName(_T("MyProc")); // use first icon in program
csTempText = szProgPath;
csTempText += _T(",0");
SetDocumentDefaultIcon(csTempText.GetData());
RegSetAllInfo();
}
}

调用:

一般是在初始化HINSTANCE 的地方:

如bool CWndShadow::Initialize(HINSTANCE hInstance)

我这里使用的是CWndShadow类,这是一个开源的阴影类,可以google一下

//注册程序与文件后缀名的关联
CRegExtension reg;
reg.RegisterFileAndProgram();
// 分析标准外壳命令、DDE、打开文件操作的命令行
if (__argc > )
{
m_csFilePath = __targv[];//我使用这种方式获取双击的后缀文件的所在路径
}

这样就可以双击运行软件了

Window 注册程序关联后缀文件,双击运行的更多相关文章

  1. WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)

    前言: 本文是基本原理介绍和手动的操作.程序实现该功能在http://blog.csdn.net/arvon2012/article/details/7839556,同时里面有完整代码的下载. 今天在 ...

  2. win10家庭版,双击bat文件无法运行(double click bat file does not execute)

    win10家庭版,双击bat文件无法运行,弹出文件打开方式选择框. 在网上搜索处理办法,试了以下方法1-5都没有成功,用方法6规避. 方法1:打开一个驱动器,点“工具-文件夹选项→文件类型→新建→扩展 ...

  3. 把 Python 脚本打包成可以直接双击运行的 .exe 文件 【转】

    因为最近要用到 Python 脚本,所以自己学习了一下,顺便学习如何把它打包成 .exe 可执行文件,达到双击运行的效果,网上找了资料,保存下来学习用,原文出处:https://baijiahao.b ...

  4. 在windows中:双击运行Python程序、后台运行Python程序

    在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...

  5. Win7不能用鼠标双击运行jar文件怎么办?

    Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件,其跨平台特性使得很多工具软件都用jar方式来部署分发,比如用于H ...

  6. Windows不能用鼠标双击运行jar文件

    Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件.可是,很多朋友遇到一个难题,那就是下载了jar文件以后在Wind ...

  7. 直接双击运行PowerShell的脚本文件

    原来的不支持有空格的路径,由dugu的批处理中找到方法了,利用windows路径的另外的另外表达方式即可,".\路径" 这个东西用的不多啊,使用这个格式后powershell就能不 ...

  8. bat文件无法双击运行

    问题: win7系统下新建txt文件,编辑脚本内容后,保存为test.bat.每次双击它,只会默认以txt格式打开它,而不是运行它. 解决: 1. 双击打开“我的电脑”,然后在“工具”下选择“文件夹选 ...

  9. centos/ubuntu 双击运行 .sh(shell)文件

    centos 创建桌面双击启动程序(更改图标) - Feythin Lau - 博客园http://www.cnblogs.com/feiyuliu/archive/2012/11/29/279503 ...

随机推荐

  1. 编写第一个MapReduce程序—— 统计气温

    摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...

  2. Css定位之absolute_慕课网课程笔记

    absolute和float 绝对定位和浮动有相似之处,即都有破坏性和包裹性,破坏性是指其会导致包裹自身的复原塌陷,包裹性是float的天赋技能,对于绝对定位来说,其会包括子元素 越独立越强大 1.去 ...

  3. XPath 节点

    在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档节点(或称为根节点). XPath 术语 节点(Node) 在 XPath 中,有七种类型的节点:元素.属性.文 ...

  4. http 中定义的八种请求的介绍

    在http1.1协议中,共定义了8种可以向服务器发起的请求(这些请求也叫做方法或动作),本文对这八种请求做出简要的介绍: 1.PUT:put的本义是推送 这个请求的含义就是推送某个资源到服务器,相当于 ...

  5. handlebars.js 用 <br>替换掉 内容的换行符

    handlebars.js 用 <br>替换掉 内容的换行符 JS: Handlebars.registerHelper('breaklines', function(text) { te ...

  6. 夺命雷公狗-----React---17--事件常用的属性

    我们可以通过打印的方式将他打印出来看看,如下所示: <!DOCTYPE> <html> <head> <meta charset="utf-8&qu ...

  7. X86 Booting Sequence

    1.BIOS 0xFFFF0 電源正常啟動後,x86 CPU 會先執行 0xFFFF0,也就是 BIOS ROM 的進入點.由於 0xFFFF0 ~ 0xFFFFF 只有少的很可憐的 16 bytes ...

  8. Azure Web Site 之 利用Azure Web site 发布网站

    由于经常混迹于MSDN Azure论坛,少不了和一些外国朋友打交道.有的时候觉得还是有一些东西可以写出来与外国友人们分享下的, 所以就用一个开源项目建了一个英文blog项目. 在发布的时候,首选的就是 ...

  9. [摘]在ASP.NET MVC中使用DropDownList

    在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性H ...

  10. 这次是Selenide测试自动发送博客

    asdfasfdfsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdsfasdfdas