FileAssociation.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:6k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // FileAssociation.cpp: implementation of the CFileAssociation class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "FileAssociation.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. void ShowRetErrorMsg(long lResult)
  13. {
  14. #ifdef _DEBUG
  15. LPVOID lpMsgBuf;
  16. FormatMessage( 
  17. FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  18. FORMAT_MESSAGE_FROM_SYSTEM | 
  19. FORMAT_MESSAGE_IGNORE_INSERTS,
  20. NULL,
  21. lResult,
  22. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  23. (LPTSTR) &lpMsgBuf,
  24. 0,
  25. NULL 
  26. );
  27. // Display the string.
  28. ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
  29. #endif
  30. assert(false);
  31. }
  32. //////////////////////////////////////////////////////////////////////
  33. // Construction/Destruction
  34. //////////////////////////////////////////////////////////////////////
  35. CFileAssociation::CFileAssociation(CString strFileTypeId, CString strFilterExt, CString strShellMenuName)
  36. {
  37. m_strFileTypeId = strFileTypeId;
  38. m_strFilterExt = strFilterExt;
  39. m_strShellMenuName = strShellMenuName;
  40. }
  41. CFileAssociation::~CFileAssociation()
  42. {
  43. }
  44. bool CFileAssociation::MakeAssocaition(bool bRegister) const
  45. {
  46. // CString strFileTypeId = "TestBT.Document";
  47. // CString strFilterExt = ".torrent";
  48. assert(!m_strFilterExt.IsEmpty() && m_strFilterExt[0] == '.');
  49. assert(!m_strFileTypeId.IsEmpty() && m_strFileTypeId.Find(' ') == -1);  // no spaces allowed
  50. CString strTemp;
  51. LONG lSize = _MAX_PATH * 2;
  52. LONG lResult = ::RegQueryValue(HKEY_CLASSES_ROOT, m_strFilterExt,
  53. strTemp.GetBuffer(lSize), &lSize);
  54. if (lResult != ERROR_SUCCESS || strTemp.IsEmpty() ||
  55. strTemp != m_strFileTypeId)
  56. {
  57. if (bRegister)
  58. {
  59. // no association for that suffix
  60. if (::RegSetValue(HKEY_CLASSES_ROOT, m_strFilterExt, REG_SZ,
  61.   m_strFileTypeId, m_strFileTypeId.GetLength() * sizeof(TCHAR)) != ERROR_SUCCESS)
  62. {
  63. return false;
  64. }
  65. return  true;
  66. }
  67. }
  68. if (lResult == ERROR_SUCCESS && strTemp == m_strFileTypeId && !bRegister)
  69. {
  70. HKEY key = 0;
  71. LONG lResult = RegOpenKey(HKEY_CLASSES_ROOT, m_strFilterExt, &key); 
  72. if (lResult == ERROR_SUCCESS)
  73. {
  74. int iRet = ::RegDeleteValue(key, NULL);
  75. if (iRet != ERROR_SUCCESS )
  76. {
  77. assert(false);
  78. ShowRetErrorMsg(iRet);
  79. }
  80. }
  81. ::RegCloseKey(key);
  82. }
  83. SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
  84. return true;
  85. }
  86. bool CFileAssociation::MakeGenerateTorrentMenu(bool bRegister) const
  87. {
  88. // CString strMenuPath = "*\shell\制作torrent(神五BT)\command";
  89. // CString strDirectoryPath = "Directory\shell\制作torrent(神五BT)\command";
  90. assert(!m_strShellMenuName.IsEmpty());
  91. CString strMenuPath = "*\shell\" + m_strShellMenuName + "\command";
  92. CString strDirectoryPath = "Directory\shell\" + m_strShellMenuName + "\command";
  93. CString strToDelMenuPath = "*\shell\" + m_strShellMenuName;
  94. CString strToDelDirectoryPath = "Directory\shell\" + m_strShellMenuName;
  95. CString strPathName ;
  96. GetShortFileName(AfxGetInstanceHandle(), strPathName);
  97. CString strCommand = """ + strPathName + """ + " /t "+ " "%1" " ;
  98. CString strTemp;
  99. LONG lSize = _MAX_PATH * 2;
  100. LONG lResult = ::RegQueryValue(HKEY_CLASSES_ROOT, strMenuPath,
  101. strTemp.GetBuffer(lSize), &lSize);
  102. if (lResult != ERROR_SUCCESS || strTemp != strCommand)
  103. {
  104. if (bRegister)
  105. {
  106. if (::RegSetValue(HKEY_CLASSES_ROOT, strMenuPath, REG_SZ,
  107.   strCommand, strCommand.GetLength() * sizeof(TCHAR)) != ERROR_SUCCESS)
  108. {
  109. return false;
  110. }
  111. }
  112. }
  113. else
  114. {
  115. if (!bRegister)
  116. {
  117. // lResult = ::RegQueryValue(HKEY_CLASSES_ROOT, strMenuPath, strTemp.GetBuffer(lSize), &lSize);
  118. //*
  119. lResult = ::RegDeleteKey(HKEY_CLASSES_ROOT, strMenuPath);
  120. if (lResult != ERROR_SUCCESS )
  121. {
  122. ShowRetErrorMsg(lResult);
  123. }
  124. lResult = ::RegDeleteKey(HKEY_CLASSES_ROOT, strToDelMenuPath);
  125. if (lResult != ERROR_SUCCESS )
  126. {
  127. ShowRetErrorMsg(lResult);
  128. }
  129. //*/
  130. }
  131. }
  132. lResult = ::RegQueryValue(HKEY_CLASSES_ROOT, strDirectoryPath,
  133. strTemp.GetBuffer(lSize), &lSize);
  134. if (lResult != ERROR_SUCCESS || strTemp != strCommand)
  135. {
  136. if (bRegister)
  137. {
  138. if (::RegSetValue(HKEY_CLASSES_ROOT, strDirectoryPath, REG_SZ,
  139.   strCommand, strCommand.GetLength() * sizeof(TCHAR)) != ERROR_SUCCESS)
  140. {
  141. return false;
  142. }
  143. }
  144. }
  145. else
  146. {
  147. if (!bRegister)
  148. {
  149. lResult = ::RegDeleteKey(HKEY_CLASSES_ROOT, strDirectoryPath);
  150. if (lResult != ERROR_SUCCESS )
  151. {
  152. ShowRetErrorMsg(lResult);
  153. }
  154. lResult = ::RegDeleteKey(HKEY_CLASSES_ROOT, strToDelDirectoryPath);
  155. if (lResult != ERROR_SUCCESS )
  156. {
  157. ShowRetErrorMsg(lResult);
  158. }
  159. }
  160. }
  161. return true;
  162. }
  163. void CFileAssociation::GetShortFileName(HINSTANCE hInst, CString& strShortName) const
  164. {
  165. TCHAR szLongPathName[_MAX_PATH];
  166. ::GetModuleFileName(hInst, szLongPathName, _MAX_PATH);
  167. if (::GetShortPathName(szLongPathName,
  168. strShortName.GetBuffer(_MAX_PATH), _MAX_PATH) == 0)
  169. {
  170. // rare failure case (especially on not-so-modern file systems)
  171. strShortName = szLongPathName;
  172. }
  173. strShortName.ReleaseBuffer();
  174. }
  175. BOOL CFileAssociation::SetRegKeyMy(LPCTSTR lpszKey, LPCTSTR lpszValue, LPCTSTR lpszValueName) 
  176. {
  177. if (lpszValueName == NULL)
  178. {
  179. if (::RegSetValue(HKEY_CLASSES_ROOT, lpszKey, REG_SZ,
  180.   lpszValue, lstrlen(lpszValue) * sizeof(TCHAR)) != ERROR_SUCCESS)
  181. {
  182. TRACE1("Warning: registration database update failed for key '%s'.n",
  183. lpszKey);
  184. return FALSE;
  185. }
  186. return TRUE;
  187. }
  188. else
  189. {
  190. HKEY hKey;
  191. if(::RegCreateKey(HKEY_CLASSES_ROOT, lpszKey, &hKey) == ERROR_SUCCESS)
  192. {
  193. LONG lResult = ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ,
  194. (CONST BYTE*)lpszValue, (lstrlen(lpszValue) + 1) * sizeof(TCHAR));
  195. if(::RegCloseKey(hKey) == ERROR_SUCCESS && lResult == ERROR_SUCCESS)
  196. return TRUE;
  197. }
  198. TRACE1("Warning: registration database update failed for key '%s'.n", lpszKey);
  199. return FALSE;
  200. }
  201. }