MFC 程序与文件关联
之前转载过一篇这方面的文章:VC 中建立程序的关联文件【http://www.mydreamsky.tk/?p=906】,但
发现用上面的方法,虽然能建立程序与文件的关联,但一旦我们的程序放在另一个目录了,就会出去
很多问题。因此想从注册表的角度上来解决这个问题,因为程序关联其实就是在注册表上进行操作的。
网上找了下,已经有前辈在这方面做了不少工作,甚至还有人已经将整个操作封装成了一个很好调用
的类。
那个类的下载:http://download.csdn.net/detail/viviwen123/4359353。用法上面有。
再贴一段在程序中具体使用的例子:
---------------------
作者:WillenWu
来源:CSDN
原文:https://blog.csdn.net/viviwen123/article/details/8465809
版权声明:本文为博主原创文章,转载请附上博文链接!
//测试文件关联
void CMainFrame::OnTestRegRelateExt()
{
CString strFileExt = TEXT(".apk");
CRegRelateExt RegRelateExt;
BOOL sign
sign
= true;
= RegRelateExt.Delete(strFileExt);// 删除.apk 与任何程序的关联
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
GetModuleFileName(NULL, exeFullPath,MAX_PATH);//得到程序模块名称,全路径
CString currentExe = (CString)exeFullPath + " %1";
sign=RegRelateExt.Set(strFileExt, currentExe);
if (sign)
{
MessageBox(TEXT("设置关联成功!"));
//注意," %1"有空格
}
else
{
}
}
MessageBox(TEXT("设置关联失败!"));
以下是类的头文件
// RegRelateExt.h: interface for the CRegRelateExt class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_REGRELATEEXT_H__6DE7E979_9011_4639_967A_D8817DF4DE44_
_INCLUDED_)
#define
AFX_REGRELATEEXT_H__6DE7E979_9011_4639_967A_D8817DF4DE44__INCLUDED
_
#include "ATLBASE.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CRegRelateExt : public CRegKey
{
////////////////////////////////////////////
///Check 用于检查某个扩展名是否与指定程序关联;
///Set 用于将某个扩展名的文件与指定程序进行关联;
///Delete 用于删除某个文件类型的关联。
////////////////////////////////////////////
public:
CRegRelateExt();
CRegRelateExt(CString FileExt, CString RelateExe = _T("XXX.exe"));
virtual ~CRegRelateExt();
BOOL Check();
BOOL Check(CString FileExt);
BOOL Set(CString FileExt, CString ShellCmd);
BOOL Delete(CString FileExt);
private:
};
BOOL m_IfRelated;
CString m_RegClass;
CString m_RelateExe;
#endif
// !defined(AFX_REGRELATEEXT_H__6DE7E979_9011_4639_967A_D8817DF4DE44__
INCLUDED_)
以下是类的实现文件
#include "stdafx.h"
//#include "LibMaker.h"
#include "RegRelateExt.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CRegRelateExt::CRegRelateExt()
{
m_IfRelated = FALSE;
}
CRegRelateExt::~CRegRelateExt()
{
}
CRegRelateExt::CRegRelateExt(CString FileExt, CString RelateExe)
{
m_RelateExe = RelateExe;
Check(FileExt);
}
BOOL CRegRelateExt::Check()
{
return m_IfRelated;
}
BOOL CRegRelateExt::Check(CString FileExt)
{
if(m_RelateExe.IsEmpty())
return FALSE;
m_IfRelated = FALSE;
//用于检测是否关联,参数为后缀名
if(Open(HKEY_CLASSES_ROOT, FileExt, KEY_READ) != ERROR_SUCCESS)
DWORD ValueLen = MAX_PATH;
TCHAR Value[MAX_PATH];
if(QueryValue(Value, _T(""), &ValueLen) != ERROR_SUCCESS)
m_IfRelated = FALSE;
Close();
m_RegClass = Value;
if(Open(HKEY_CLASSES_ROOT, m_RegClass + _T("\\shell\\open\\command"),
KEY_READ) !=
ERROR_SUCCESS)
m_IfRelated = FALSE;
ValueLen = MAX_PATH;
if(QueryValue(Value, _T(""), &ValueLen) != ERROR_SUCCESS)
m_IfRelated = FALSE;
Close();
CString CmdLine = Value;
if(CmdLine.Find(m_RelateExe) != -1)
m_IfRelated = TRUE;
else
m_IfRelated = FALSE;
return m_IfRelated;
}
BOOL CRegRelateExt::Delete(CString FileExt)
{
if(FileExt.IsEmpty())
return FALSE;
return FALSE;
if(Open(HKEY_CLASSES_ROOT, FileExt, KEY_READ) != ERROR_SUCCESS)
DWORD ValueLen = MAX_PATH;
TCHAR Value[MAX_PATH];
if(QueryValue(Value, _T(""), &ValueLen) != ERROR_SUCCESS)
return FALSE;
Close();
Attach(HKEY_CLASSES_ROOT);
if(RecurseDeleteKey(Value) != ERROR_SUCCESS)
if(RecurseDeleteKey(FileExt) != ERROR_SUCCESS)
return FALSE;
return FALSE;
return TRUE;
}
BOOL CRegRelateExt::Set(CString FileExt, CString ShellCmd)
{
if(FileExt.IsEmpty() || ShellCmd.IsEmpty())
return FALSE;
m_RelateExe = ShellCmd;
m_RegClass = _T("Rzmk File");
Delete(FileExt);
if(Create(HKEY_CLASSES_ROOT, FileExt) != ERROR_SUCCESS)
if(SetValue(HKEY_CLASSES_ROOT, FileExt, m_RegClass) != ERROR_SUCCESS)
if(Create(HKEY_CLASSES_ROOT, m_RegClass) != ERROR_SUCCESS)
if(SetValue(HKEY_CLASSES_ROOT, m_RegClass, _T("XXX File")) !=
if(SetValue((DWORD)0x08, _T("BrowserFlags")) != ERROR_SUCCESS)
if(SetValue((DWORD)0x00, _T("EditFlags")) != ERROR_SUCCESS)
if(SetValue(HKEY_CLASSES_ROOT, m_RegClass, _T("XXX File")) !=
if(Create(HKEY_CLASSES_ROOT, m_RegClass + _T("\\DefaultIcon")) !=
return FALSE;
return FALSE;
return FALSE;
ERROR_SUCCESS)
return FALSE;
return FALSE;
return FALSE;
ERROR_SUCCESS)
return FALSE;
ERROR_SUCCESS)
return FALSE;
if(SetValue(HKEY_CLASSES_ROOT, m_RegClass + _T("\\DefaultIcon"), ShellCmd +
_T("XXX.ico"))
!= ERROR_SUCCESS)
return FALSE;
ERROR_SUCCESS)
return FALSE;
ERROR_SUCCESS)
return FALSE;
!= ERROR_SUCCESS)
return FALSE;
if(Create(HKEY_CLASSES_ROOT, m_RegClass + _T("\\shell")) !=
if(Create(HKEY_CLASSES_ROOT, m_RegClass + _T("\\shell\\open")) !=
if(Create(HKEY_CLASSES_ROOT, m_RegClass + _T("\\shell\\open\\command"))
TCHAR exeFullPath[MAX_PATH];
GetModuleFileName(NULL,exeFullPath,MAX_PATH);
if(SetValue(HKEY_CLASSES_ROOT,m_RegClass + _T("\\shell\\open\\command"),
(CString)(exeFullPath) + _T(" \"%1\"")) != ERROR_SUCCESS)
return FALSE;
m_IfRelated = TRUE;
return TRUE;
}