自定义文件格式注册和图标设置

2023-05-16

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

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,郁闷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 行业前沿|无人机视觉自主导航发展及视觉智能开发支撑平台介绍

    01视觉自主导航技术基本介绍 近年来 xff0c 无人机在多领域表现出重要应用价值 目前 xff0c 无人机如何在未知封闭 无辅助导航支撑的环境中 xff0c 达成 在哪里 和 环境描述 并自主智能地完成特定任务 xff0c 是一个重要的研
  • 基于图像拼接的无人机自主导航实时SLAM

    大多数无人机利用全球导航卫星系统 xff08 GNSS xff09 技术和惯性传感器 xff08 INS xff09 来估计自己的地理空间定位 无人机通过GNSS接收器进行增强 xff0c 这些接收器受益于从卫星发射的接收时间无线电信号来计
  • jar 压缩解压缩

    JAR包是Java中所特有一种压缩文档 其实大家就可以把它理解为 zip包 当然也是有区别的 JAR包中有一个META INF MANIFEST MF文件 当你找成JAR包时 它会自动生成 JAR包是由JDK安装目录 bin jar exe
  • Inverse elbow manipulator的正逆运动

    Inverse elbow manipulator 该结构同样是6 DOF xff0c 只是后面三个关节不是重合 这样子的结构 xff0c 工作空间更大 正运动好做 xff0c 逆运动还在推导中
  • 使用IMU进行状态估计及进阶

    文章目录 前言基本思想一 姿态估计1 1 通过6轴IMU来进行姿态估计的入门级方法1 1 1 通过加速度计计算姿态1 1 2 引入陀螺仪来得到更好的姿态估计 1 2 四元数解算姿态角解析 二 姿态估算与滤波的关系2 1 状态方程和观测方程2
  • Mujoco-小球建模与控制

    视频教程 xff1a https www bilibili com video BV1e44y1H7Mn 资源请到tiny cc mujoco下载 涉及内容 本次课程制作了一个简单的小球模型 然后对小球进行简单的模拟 xff0c 并演示了一
  • Mujoco-欠驱动的二阶单摆的LQR控制

    MuJoCo Lec7 span class token keyword void span span class token function f span span class token punctuation span span c
  • 四元数姿态计算

    本文基本上就是 1 的注解 一基本概念 1 1 四元数的定义 Quaternion A quaternion is a four dimensional complex number 四元数是一个四维的复数 写成行向量形式的话 q 61 q
  • Mujoco的关节与外力和驱动器

    核心公式 xff1a M qacc 43 qfrc bias 61 qfrc applied 43 ctrl M xff1a 惯性矩阵 qacc 加速度 qfrc bias 科里奥利矩阵和重力矩阵之和 xff1a qfrc bias 61
  • F28069的cpu定时器

    工程搭建参考 xff1a https blog csdn net feisy article details 126380289 F28069有三个32位的CPU定时器 xff1a 0 1 2 0 xff0c 1可用 xff0c 如果程序未
  • TI DSP的中断

    F28069的中断数是96个 xff0c 分为12组 The PIE block can support 96 individual interrupts that are grouped into blocks of eight Each
  • DSP的PWM

    PRD 周期寄存器 xff0c 决定了PWM的周期 频率 CMP 比较寄存器 xff0c 决定了PWM的占空比 CRT 计数寄存器 PWM原理图 为什么需要PWM
  • 出色的html滑动效果库 swiper -例子4 超长单栏横向滑动

    可以用于div滑动 xff0c 图片滑动等切换 例子代码以及所需资源 xff1a http download csdn net detail feisy 6638105 官网例子 xff1a 使用iframe来在同一个页面里面加入了很多各种
  • 【华人学者风采】张祥雨 旷视研究院

    华人学者风采 张祥雨 xff0c 旷视研究院基础模型负责人 研究领域主要为计算机视觉 曾与旷视首席科学家孙剑博士共同发明深度残差网络 ResNet 2020年发表论文 xff1a 22 发表论文 xff1a 58 论文引用数 xff1a 6
  • 出色的html滑动效果库 swiper -例子5 横向自由滑动 可以滑动部分

    可以用于div滑动 xff0c 图片滑动等切换 例子代码以及所需资源 xff1a http download csdn net detail feisy 6638105 官网例子 xff1a 使用iframe来在同一个页面里面加入了很多各种
  • 不要将两个指针变量指向同一块动态内存

    不要将两个指针变量指向同一块动态内存 这个容易引起很严重的问题 如果将两个指针变量指向同一块动态内存 xff0c 而其中一个生命期结束释放了该动态内存 xff0c 这个时候就会出现问题 xff0c 另一个指针所指向的地址虽然被释放了但该指针
  • CMAKE的一些编译选项

    set CMAKE BUILD TYPE 34 Release 34 if CMAKE BUILD TYPE STREQUAL 34 Debug 34 set CMAKE CXX FLAGS 34 CMAKE CXX FLAGS std 6
  • 查看当前系统的glibc版本

    from http my oschina net acmfly blog 77211 有时我们经常需要查看当前系统的glibc版本 xff0c 可以这样查看 xff1a lib libc so 6 有时 xff1a lib x86 64 l
  • 禁忌搜索算法简介

    忌搜索 xff08 Tabu Search或Taboo Search xff0c 简称TS xff09 的思想最早由Glover 1986 提出 xff0c 它是对局部领域搜索的一种扩展 xff0c 是一种全局逐步寻优算法 xff0c 是对
  • 自定义文件格式注册和图标设置

    我们很多时候可能会有这样的一种需求 xff0c 即要生成自己的文件格式 xff0c 然后将这种文件格式注册到操作系统中 xff0c 双击就会使用特定的程序来打开 xff0c 并且我们还想为这种文件格式设置一个图标和缩略 本文章解决的是注册文