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

这篇博客介绍了如何在Windows操作系统中注册自定义文件格式并设置文件图标。通过使用`RegeditYourFile`和`ModifyIcon`两个函数,可以实现双击自定义文件时调用指定程序打开,并为文件格式分配图标。文章详细阐述了这两个函数的实现原理和调用方法。
摘要由CSDN通过智能技术生成

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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Feisy/archive/2008/07/24/2705628.aspx

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值