Window 注册程序关联后缀文件,双击运行
一般来说,很多软件都会有自定义后缀的文件,比如.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 注册程序关联后缀文件,双击运行的更多相关文章
- WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)
前言: 本文是基本原理介绍和手动的操作.程序实现该功能在http://blog.csdn.net/arvon2012/article/details/7839556,同时里面有完整代码的下载. 今天在 ...
- win10家庭版,双击bat文件无法运行(double click bat file does not execute)
win10家庭版,双击bat文件无法运行,弹出文件打开方式选择框. 在网上搜索处理办法,试了以下方法1-5都没有成功,用方法6规避. 方法1:打开一个驱动器,点“工具-文件夹选项→文件类型→新建→扩展 ...
- 把 Python 脚本打包成可以直接双击运行的 .exe 文件 【转】
因为最近要用到 Python 脚本,所以自己学习了一下,顺便学习如何把它打包成 .exe 可执行文件,达到双击运行的效果,网上找了资料,保存下来学习用,原文出处:https://baijiahao.b ...
- 在windows中:双击运行Python程序、后台运行Python程序
在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...
- Win7不能用鼠标双击运行jar文件怎么办?
Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件,其跨平台特性使得很多工具软件都用jar方式来部署分发,比如用于H ...
- Windows不能用鼠标双击运行jar文件
Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件.可是,很多朋友遇到一个难题,那就是下载了jar文件以后在Wind ...
- 直接双击运行PowerShell的脚本文件
原来的不支持有空格的路径,由dugu的批处理中找到方法了,利用windows路径的另外的另外表达方式即可,".\路径" 这个东西用的不多啊,使用这个格式后powershell就能不 ...
- bat文件无法双击运行
问题: win7系统下新建txt文件,编辑脚本内容后,保存为test.bat.每次双击它,只会默认以txt格式打开它,而不是运行它. 解决: 1. 双击打开“我的电脑”,然后在“工具”下选择“文件夹选 ...
- centos/ubuntu 双击运行 .sh(shell)文件
centos 创建桌面双击启动程序(更改图标) - Feythin Lau - 博客园http://www.cnblogs.com/feiyuliu/archive/2012/11/29/279503 ...
随机推荐
- 学习vulkan的几个有用的网址
<ignore_js_op> 1)一个权威向导网站:https://vulkan-tutorial.com/2)Imagination图形组织官网http://imgtec.eetrend ...
- mac上启动Java项目失败
解决办法参考地址:http://bbs.csdn.net/topics/390813742,感谢csdn账号为iwordword的大神
- c3p0连接池]
<c3p0-config> <!-- 默认配置 --> <default-config> <property name="jdbcUrl" ...
- ajaxfileupload 传参数
引用:http://www.cnblogs.com/lyeo/archive/2012/05/11/2496261.html 直接上代码: var data = { name: 'my name', ...
- 常用oracle表空间查询语句
--查询数据库表空间使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/ ...
- 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法
无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问.)” (Microsoft SQL Server,错误: 5120)的解决方法 问题描述: 在附加数据库到sql server时,附 ...
- Maximo7自定义实现WebService
最近很多人在群里聊这个话题,我就也一个hello world来实现一下. 1.自定义一个类,继承于AppService 代码如下:
- [综合]visio2013安装提示找不到Office.zh_cn\officeMUI.mis officemui.xml
在visio2013安装提示找不到Office.zh_cn\officeMUI.mis officemui.xml 等等,各种提示,可是打开安装程序所在的ISO,里面可是“赶集网”——啥都有啊.上网查 ...
- Qt Creator pro 文件 导入vs2013碰到的问题
显示error LNK1117:sytax error in option... 解决办法 从Properties --> Linker --> Command Line 中删掉Addit ...
- Makefile编译库
funs.h: #ifndef __FUNS_H__ #define __FUNS_H__ void fun1(); #endif funs.c #include "funs.h" ...