刚搞了个程序要做文件关联,可麻烦了,上网看的有些错误的,有些看了也不懂,所以搞了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);
}