文件类型及相关打开程序的注册
2015-08-25 11:11
288 查看
譬如:注册文件类型.pln,为其指定文件类型图标,并使用当前程序作为默认打开程序。
调用如下:
RegisterShellFileType(".pln", "Plan.Documnet", "规划文件", 1);
其中参数的含义:
● filterExt:文件后缀名
● fileTypeID:文件类型ID
● fileTypeDesc:文件描述
● iconIndex:文件图标在当前程序中的索引
BOOL CPlanningApp::RegisterShellFileType(CString filterExt, CString fileTypeID, CString fileTypeDesc, int iconIndex)
{
CString strPathName, strTemp;
TCHAR szLongPathName[_MAX_PATH];
TCHAR szShortPathName[_MAX_PATH];
::GetModuleFileName(this->m_hInstance, szLongPathName, _MAX_PATH);
if (::GetShortPathName(szLongPathName, szShortPathName, _MAX_PATH) == 0)
{
// rare failure case (especially on not-so-modern file systems)
strPathName = szLongPathName;
}
else
{
strPathName = szShortPathName;
}
// first register the type ID of our server
if (!SetClassesKey(fileTypeID, fileTypeDesc))
return FALSE; // just skip it
// path\DefaultIcon = path,1
strTemp.Format("%s\\DefaultIcon", (LPCTSTR)fileTypeID);
CString strDefaultIcon;
strDefaultIcon.Format("\"%s\",%d", strPathName, iconIndex);
if (!SetClassesKey(strTemp, strDefaultIcon))
return FALSE; // just skip it
// path\shell\open\command = path filename
strTemp.Format("%s\\shell\\open\\%s", (LPCTSTR)fileTypeID,
"command");
CString strOpenCommand;
strOpenCommand.Format("\"%s\" \"%%1\"", strPathName);
if (!SetClassesKey(strTemp, strOpenCommand))
return FALSE; // just skip it
// no association for that suffix
if (!SetClassesKey(filterExt, fileTypeID))
return FALSE; // just skip it
return TRUE;
}
BOOL CPlanningApp::SetClassesKey(LPCTSTR lpszKey, LPCTSTR lpszValue, LPCTSTR lpszValueName)
{
if (lpszValueName == NULL)
{
if (::RegSetValue(HKEY_CLASSES_ROOT, lpszKey, REG_SZ,
lpszValue, lstrlen(lpszValue) * sizeof(TCHAR)) != ERROR_SUCCESS)
{
TRACE1("Warning: registration database update failed for key '%s'.\n",
lpszKey);
return FALSE;
}
return TRUE;
}
else
{
HKEY hKey;
if(::RegCreateKey(HKEY_CLASSES_ROOT, lpszKey, &hKey) == ERROR_SUCCESS)
{
LONG lResult = ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ,
(CONST BYTE*)lpszValue, (lstrlen(lpszValue) + 1) * sizeof(TCHAR));
if(::RegCloseKey(hKey) == ERROR_SUCCESS && lResult == ERROR_SUCCESS)
return TRUE;
}
TRACE1("Warning: registration database update failed for key '%s'.\n", lpszKey);
return FALSE;
}
}
调用如下:
RegisterShellFileType(".pln", "Plan.Documnet", "规划文件", 1);
其中参数的含义:
● filterExt:文件后缀名
● fileTypeID:文件类型ID
● fileTypeDesc:文件描述
● iconIndex:文件图标在当前程序中的索引
BOOL CPlanningApp::RegisterShellFileType(CString filterExt, CString fileTypeID, CString fileTypeDesc, int iconIndex)
{
CString strPathName, strTemp;
TCHAR szLongPathName[_MAX_PATH];
TCHAR szShortPathName[_MAX_PATH];
::GetModuleFileName(this->m_hInstance, szLongPathName, _MAX_PATH);
if (::GetShortPathName(szLongPathName, szShortPathName, _MAX_PATH) == 0)
{
// rare failure case (especially on not-so-modern file systems)
strPathName = szLongPathName;
}
else
{
strPathName = szShortPathName;
}
// first register the type ID of our server
if (!SetClassesKey(fileTypeID, fileTypeDesc))
return FALSE; // just skip it
// path\DefaultIcon = path,1
strTemp.Format("%s\\DefaultIcon", (LPCTSTR)fileTypeID);
CString strDefaultIcon;
strDefaultIcon.Format("\"%s\",%d", strPathName, iconIndex);
if (!SetClassesKey(strTemp, strDefaultIcon))
return FALSE; // just skip it
// path\shell\open\command = path filename
strTemp.Format("%s\\shell\\open\\%s", (LPCTSTR)fileTypeID,
"command");
CString strOpenCommand;
strOpenCommand.Format("\"%s\" \"%%1\"", strPathName);
if (!SetClassesKey(strTemp, strOpenCommand))
return FALSE; // just skip it
// no association for that suffix
if (!SetClassesKey(filterExt, fileTypeID))
return FALSE; // just skip it
return TRUE;
}
BOOL CPlanningApp::SetClassesKey(LPCTSTR lpszKey, LPCTSTR lpszValue, LPCTSTR lpszValueName)
{
if (lpszValueName == NULL)
{
if (::RegSetValue(HKEY_CLASSES_ROOT, lpszKey, REG_SZ,
lpszValue, lstrlen(lpszValue) * sizeof(TCHAR)) != ERROR_SUCCESS)
{
TRACE1("Warning: registration database update failed for key '%s'.\n",
lpszKey);
return FALSE;
}
return TRUE;
}
else
{
HKEY hKey;
if(::RegCreateKey(HKEY_CLASSES_ROOT, lpszKey, &hKey) == ERROR_SUCCESS)
{
LONG lResult = ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ,
(CONST BYTE*)lpszValue, (lstrlen(lpszValue) + 1) * sizeof(TCHAR));
if(::RegCloseKey(hKey) == ERROR_SUCCESS && lResult == ERROR_SUCCESS)
return TRUE;
}
TRACE1("Warning: registration database update failed for key '%s'.\n", lpszKey);
return FALSE;
}
}
相关文章推荐
- synchronized(lock)
- centos7中rpm,yum软件安装命令
- HasnMap的一种遍历方式:Map.Entry 和 Map.entrySet()
- jenkins里面使用批处理命令进行自动部署
- Clustering text documents using k-means
- Leetcode: Course Schedule
- python函数式编程内建函数filter,map,reduce函数
- iOS国际化:程序名称国际化、内容国际化、storyboard国际化
- Sahi 使用技巧2-高亮查找元素以及正则匹配元素
- hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场
- Android笔记:反向横屏
- 反射机制与IOC容器
- javascript表单验证之SQL注入验证
- HDU1009 FatMouse' Trade
- Swap in JAVA, 不是想象中的简单
- Android-ViewFlipper(图片轮播 和 手势控制 实例)
- 黑马程序员-----Java基础-----IO流-3
- 理解CSS中的块级格式化上下文
- Nginx配置文件nginx.conf中文详解
- R语言_回归分析