我们很多时候可能会有这样的一种需求,即要生成自己的文件格式,然后将这种文件格式注册到操作系统中,双击就会使用特定的程序来打开,并且我们还想为这种文件格式设置一个图标和缩略。本文章解决的是注册文件格式和设置文件的图标,至于缩略图的设置请看我空间的另外一篇文章。
 注册文件需要用到下面两个函数:

BOOL RegeditYourFile(string ExtName)
{
CString csKey = ExtName.c_str();
CString m_csDocumentClassName = "YourFileExtName.file";
::GetModuleFileName(NULL, szProgPath, sizeof(szProgPath)/sizeof(TCHAR));//本执行程序的路径,用来在命令模式下也可以打开该
//类型的文件
CString csTempText;
// just pass file path in quotes on command line
csTempText  = szProgPath;
csTempText += " /"%1/"";
CString m_csShellOpenCommand = csTempText;
SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csDocumentClassName);//注册一个.VTemplate后缀的主键
if( !m_csShellOpenCommand.IsEmpty() )
{//注册命令模式下打开该类型文件的执行程序
csKey += "//shell//open//command";
SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csShellOpenCommand);
}
csKey = m_csDocumentClassName;
CString m_csDocumentDescription = "";
csTempText  = szProgPath;
csTempText += ",1";
CString m_csDocumentDefaultIcon = csTempText;
SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csDocumentDescription);
// DefaultIcon
if( !m_csDocumentDefaultIcon.IsEmpty() )
{
csKey  = m_csDocumentClassName;
csKey += "//DefaultIcon";
SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csDocumentDefaultIcon);
}
// shell/open/command
if( !m_csShellOpenCommand.IsEmpty() )
{
csKey  = m_csDocumentClassName;
csKey += "//shell//open//command";
SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csShellOpenCommand);
}
return TRUE;
}
BOOL SetRegistryValue(HKEY hOpenKey,LPCTSTR szKey,LPCTSTR szValue,LPCTSTR szData)
{
// validate input
if( !hOpenKey || !szKey || !szKey[0] ||
!szValue || !szData )
{
::SetLastError(E_INVALIDARG);
return FALSE;
}
BOOL    bRetVal = FALSE;
DWORD   dwDisposition;
DWORD   dwReserved = 0;
HKEY    hTempKey = (HKEY)0;
// 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)0, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, 0,
&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;

其中里面的原理主要是操作注册表,具体自己看。
比如,你想为自己的自定义文件格式.why注册,则可以这样子调用上面的函数:

RegeditYourFile(.why);

注册完文件格式以后,要给这种文件格式设置一个图标,这要用到下面的函数:

BOOL  ModifyIcon(LPCSTR   ExtName,   LPCSTR   IconFile)
{
BOOL   ret;
LONG   nLen;
char   Key[65];
char   buf[MAX_PATH];
nLen   =   sizeof(Key);
if   (RegQueryValue(HKEY_CLASSES_ROOT,ExtName,Key,
&nLen)   !=   ERROR_SUCCESS)
return   FALSE;
if   (Key[0]=='/0')   return   FALSE;
strcat(Key,   "//DefaultIcon");
strcpy(buf,   IconFile);     strcat(buf,   ",   0");
ret   =   RegSetValue(HKEY_CLASSES_ROOT,   Key,
REG_SZ,   buf,   sizeof(buf)+1)   ==   ERROR_SUCCESS;
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_FLUSHNOWAIT,
0,   0);
return   ret;
}

然后你可以这样子调用:

ModifyIcon(".why","C://myicon.ico");搞定。PS:很多人从我这里学到或拿走东西,没人说句3Q,郁闷。

自定义文件格式注册和图标设置相关推荐

  1. jquery 自定义正方形图标_苹果ios14桌面小组件怎么改图标 更换桌面图标设置教程...

    ios14小组件除了自定义桌面图片之外,还可以更换图标,使得每个软件图标都有不一样的变化,让你的桌面焕然一新,这里需要使用快捷指令来完成,ios14小组件怎么更换图标?怎么设置?下面带来介绍. ios ...

  2. 三个自定义图标设置,让你的iPhone可爱亿点点!

    iPhone简约的图标设置一直被认为是经典,但有些朋友可能想设置自己喜欢的图标.你知道苹果手机图标设置的方法吗?你是不是见过别人可爱的锁屏设置.来电显示的可爱头像.蜂窝号码的卡通图标,这些你都会弄吗? ...

  3. win7注册表常用设置

    win7注册表常用设置 一.总结 一句话总结:regedit可以修改很多东西,电脑时间,背景,u盘读写,鼠标右键情况. 二.win7注册表常用设置 一. 秀出自我风格的屏幕保护画面 1.气泡屏幕保护 ...

  4. 主题图标_Avada主题网站favicon图标设置详细图文教程

    Avada主题网站favicon图标如何设置?很多网站打开后在浏览器标题栏会发现前面有一个小图标,在浏览器标签页和收藏夹中也能看到.这个标志名叫 favicon图标.ico图标.网站图标.是展示网站个 ...

  5. 桌面图标设计里的计算机是灰色的,小技巧教您如何将Windows 10上的桌面图标设置中的回收站为灰色!...

    如果Windows 10的``桌面图标设置''窗口中的``回收站''选项显示为灰色,则可以查看本逐步指南以解决问题.这将帮助您取回"桌面图标设置"面板中的"回收站&quo ...

  6. dubbo简易实现_分别利用自定义的注册中心和zookeeper

    2019独角兽企业重金招聘Python工程师标准>>> dubbo + (点对点型.zookeeper)整合,理解其思想,熟悉其基本流程 2017-06-25 (github地址:h ...

  7. echarts中自定义图片的矢量路径设置

    echarts中自定义图片的矢量路径设置 在echarts象形柱图中要使用自定义的图片有三种格式,如下图: 前面两种方式我们项目中也常用到,第三种是矢量路径,如何获取这个矢量路径呢,方法如下: 第一步 ...

  8. win10在主题下桌面图标设置时提示windows无法访问指定设备、路径或文件问题的解决方法

    win10在主题->桌面图标设置时提示:'windows无法访问指定设备.路径或文件'问题的解决方法. 问题: 心血来潮想整理下桌面图标点开 个性化>主题>桌面图标显示,发现系统提示 ...

  9. typecho图标_Typecho微信自定义分享插件WeChatShare 自定义标题描述小图标

    前言 张小龙带领微信走进了大众的生活,在十亿用户的生活里扎根.于是我们不管是阅读.聊天.看视频,基本上都离不开微信.好东西分享给用户,第一时间想到的肯定是微信. 很久以前,一个网页分享到微信聊天,系统 ...

最新文章

  1. Windows Internals 笔记——关联性
  2. Arithmetic Sequence 三分,货仓选址,nth_element,__int128(济南)
  3. 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
  4. 通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计
  5. epoll socket 服务端中read和write的返回值讨论
  6. 【并查集】打击犯罪(ssl 2342)
  7. 【WebRTC---进阶篇】(六)SELECT网络模型
  8. 让nginx 支持 pathinfo ,支持thinkphp
  9. Castle ActiveRecord学习实践(6):延迟加载和使用Where子句
  10. 如何搞定知乎模拟登陆的加密难题?
  11. 【前端】数字媒体技术专业主要课程及就业方向
  12. Atitit 路由器下面的网络o多个路由器配置 因为存在多个dhcp 所以,不能网有时.. 更改主要的路由路由器 88.88 这样不能ip冲突..and 外部的的dhcp 范围... 在的
  13. 代码设置textField和textView的border和borderColor
  14. Radio Dream流媒体直播平台基于Docker的应用
  15. python 兼职多少钱一小时_无印良品兼职一小时多少钱?看完后就清楚了!
  16. 【HTML系列】第二章 · HTML基础
  17. 倾角传感器精度校准检测
  18. 目标管理之SMART原则
  19. OGRE渲染引擎之地形、天空和雾
  20. 人工神经网络算法实战教程

热门文章

  1. 【图像处理】基于matlab GUI多功能图像处理系统【含Matlab源码 1876期】
  2. 【故障检测】基于 KPCA 的故障检测研究(Matlab代码实现)
  3. postman工具批量调用接口
  4. Android 音乐裁剪器
  5. 中国信通院:5G无人机应用白皮书
  6. 【疑难杂症】Oculus Quest2 手机配对时找不到5-digit-code
  7. Ubuntu忘记超级用户root密码,重新设置密码
  8. 东北大学计算机硬件题库,东北大学20春学期《计算机硬件技术基础》在线平时作业123答案100...
  9. 在2018年使用xp是怎样的体验
  10. Matlab小课堂3