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