VC文件关联,详细介绍,易懂 ,还亲测可用

刚搞了个程序要做文件关联,可麻烦了,上网看的有些错误的,有些看了也不懂,所以搞了2个小时。现搞好后,发一篇易懂的介绍文件关联的文章:


(1)首先举个例子先。例子中将文件扩展名为.tp的文件关联到程序。将文件关联到程序的重点是在注册表上写一些东西,如下图

(写的东西都是在HKEY_CLASSES_ROOT上写)

是在HKEY_CLASSES_ROOT展开下的。添加了一个新项.tp,而这新项的值可不是随便乱定,因为打开文件扩展名为.tp的文件,将读取HKEY_CLASSES_ROOT下.tp项的值,再从这值所代表的项中读取关联的程序相关信息(如图标,程序路径)




也是在HKEY_CLASSES_ROOT展开下的,添加了一个新项TOUCHPANEL,新项TOUCHPANEL下的DefaultIcon项的值代表关联文件图标路径(不是单纯写路径,有些格式),新项TOUCHPANEL下的shell\\open\\command项的值代表程序路径(不是单纯写路径,有些格式),


到这一步,文件扩展名为.tp的文件就关联到程序了。如果不行的话,1:可能相关路径写错,因为有路径格式要求;2:之前这个该.tp文件扩展名的文件可能用其它程序打开过,造成该文件与其它程序关联上了,可以鼠标右键该文件,选择打开方式-选择默认程序-选择你想关联的程序就行了


(2)可以手动添加进行测试文件关联,下面是VC下的unicode编码的代码:

void CTouchPanelApp::setFileRelation()//调用设置文件关联
{
	TCHAR appPath[_MAX_PATH];//程序路径
	TCHAR appName[_MAX_PATH];//写进注册表的进行一些格式化的程序路径

	const TCHAR* NAME_APP = _T("TOUCHPANEL");//应用程序名称,其实这个名字可以随便定的
	const TCHAR* NAME_PROJECTFILE_EXT = _T(".tp");//要关联的文件的扩展名

	if(GetModuleFileName(NULL, appPath, _MAX_PATH) != 0)
	{
		swprintf_s(appName, _T("\"%s\" %%1"), appPath);

		//检查注册表是否已经添加了,没有则添加
		if (!checkFileRelation(NAME_PROJECTFILE_EXT, appName, NAME_APP))
		{
			TCHAR icoPath[_MAX_PATH];
			swprintf_s(icoPath, _T("%s, 1"), appPath);
			registerFileRelation(NAME_PROJECTFILE_EXT, appName, NAME_APP, icoPath);
		}
	}
}

BOOL CTouchPanelApp::checkFileRelation(const TCHAR *strExt,
	const TCHAR *strAppName,
	const TCHAR *strAppKey)
{
	int nRet = FALSE;


	HKEY hExtKey;


	TCHAR strTemp[_MAX_PATH]; 


	DWORD dwSize=sizeof(strTemp); 


	if (RegOpenKey(HKEY_CLASSES_ROOT, strExt, &hExtKey) == ERROR_SUCCESS)
	{
		RegQueryValueEx(hExtKey, NULL, NULL, NULL, (LPBYTE)strTemp, &dwSize);

		RegCloseKey(hExtKey);

		//检查.tp的值是否与设置的一样
		if(_tcscmp(strTemp, strAppKey) == 0)
		{
			swprintf_s(strTemp, _T("%s\\shell\\open\\command"), strAppKey);


			if (RegOpenKey(HKEY_CLASSES_ROOT, strTemp, &hExtKey) == ERROR_SUCCESS)
			{
				RegQueryValueEx(hExtKey, NULL, NULL, NULL, (LPBYTE)strTemp, &dwSize);

				//检查TOUCHPANEL下的\\shell\\open\\command上的程序路径是否一样
				if(_tcscmp(strTemp, strAppName) == 0)
				{
					nRet = TRUE;
				}


				RegCloseKey(hExtKey);
			}
		}
	}


	return nRet;
}


void CTouchPanelApp::registerFileRelation(const TCHAR *strExt, 
	const TCHAR *strAppName, 
	const TCHAR *strAppKey, 
	const TCHAR *strDefaultIcon)
{
	TCHAR strTemp[_MAX_PATH];
	HKEY hKey;

	//新项.tp
	RegCreateKey(HKEY_CLASSES_ROOT, strExt, &hKey);
	RegSetValue(hKey, _T(""), REG_SZ, strAppKey, _tcslen(strAppKey) + 1);
	RegCloseKey(hKey);

	//新项TOUCHPANEL
	RegCreateKey(HKEY_CLASSES_ROOT, strAppKey, &hKey);
	RegCloseKey(hKey);

	//新项TOUCHPANEL下DefaultIcon
	swprintf_s(strTemp, _T("%s\\DefaultIcon"), strAppKey); 
	RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
	RegSetValue(hKey, _T(""), REG_SZ, strDefaultIcon, _tcslen(strDefaultIcon) + 1);
	RegCloseKey(hKey);

	//新项TOUCHPANEL下shell
	swprintf_s(strTemp, _T("%s\\shell"), strAppKey);
	RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
	RegSetValue(hKey, _T(""), REG_SZ, _T("open"), _tcslen(_T("open")) + 1);
	RegCloseKey(hKey);

	//新项TOUCHPANEL下shell\\open\\command
	swprintf_s(strTemp, _T("%s\\shell\\open\\command"), strAppKey);
	RegCreateKey(HKEY_CLASSES_ROOT, strTemp, &hKey);
	RegSetValue(hKey,_T(""),REG_SZ, strAppName,_tcslen(strAppName)+1);
	RegCloseKey(hKey);
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶恭介叶恭介

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值