一般来说,很多软件都会有自定义后缀的文件,比如.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. DLL注入

    最近的项目涉及了软件破解方面的知识,记录一下. 将dll注入另一个进程. // Inject.cpp : Defines the exported functions for the DLL appl ...

  2. PHPExcel--基本操作

    下面是PHPExcel的导入与导出的基本操作,也是最重要的两个操作. 生成文件: <?php require_once './Classes/PHPExcel.php'; $content = ...

  3. failed to lazily initialize a collection of role:XXX, no sessi

    系统 框架  springMVC+hibernate 这种情况 由于 hibernate 的 懒汉机制,和 Spring 事务机制(不确定)造成的 由于 spring 配置的时候,在service 层 ...

  4. sqlserver 插入数据时异常,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'XXXXX.dbo.XXXXXXXXX'中的标识列指定显式值。

    INSERT INTO XXXXXXXXX.dbo.XXXXXXXXX select * from XXXXXXXXX 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'X ...

  5. web前端浮动、清浮动问题

    浮动的问题如下一一列举如有考虑不周的欢迎欢迎大家补充: 1.浮动,兼容性问题3px的问题,双边距的问题 在平时工作的过程中,解决3px的问题,一般都是初始化*{margin:0;padding:0px ...

  6. 机器学习实战4:Adaboost提升:病马实例+非均衡分类问题

    Adaboost提升算法是机器学习中很好用的两个算法之一,另一个是SVM支持向量机:机器学习面试中也会经常提问到Adaboost的一些原理:另外本文还介绍了一下非平衡分类问题的解决方案,这个问题在面试 ...

  7. 坑爹的 SONY AS100V GPS

    事情是这样的,为了记录自己的生活,也是出于对视频编辑的兴趣,买了一台 SONY 的 AS100V 运动摄像机. 公司到货,回家路上拍了一段,回家兴冲冲的连上电脑,想看看 GPS 数据,发现是 SONY ...

  8. 面试题HTML +CSS

    HTML+CSS部分1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素?行内元素:和有他元素都在一行上,高度.行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他 ...

  9. Fuel UX wizard example

    <!DOCTYPE html> <html class="no-js fuelux"> <head> <meta charset=&quo ...

  10. c++源文件后缀名

    C中: 头文件后缀名: .h 源文件后缀名: .c C++中: 头文件后缀名: .h,   .hpp,   .hxx 源文件后缀名:.cpp,   .cc,   .cxx,   .C   .c++ 现 ...