ROWSET.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // Rowset.h : Declaration of the CRowset
  2. //
  3. // This is a part of the ActiveX Template Library.
  4. // Copyright (C) 1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // ActiveX Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // ActiveX Template Library product.
  12. #ifndef __ROWSET_H_
  13. #define __ROWSET_H_
  14. #include "resource.h"       // main symbols
  15. class CWindowsFile:
  16. public WIN32_FIND_DATA
  17. {
  18. public:
  19. BEGIN_PROVIDER_COLUMN_MAP(CWindowsFile)
  20. PROVIDER_COLUMN_ENTRY("FileAttributes", 1, dwFileAttributes)
  21. PROVIDER_COLUMN_ENTRY("FileSizeHigh", 2, nFileSizeHigh)
  22. PROVIDER_COLUMN_ENTRY("FileSizeLow", 3, nFileSizeLow)
  23. PROVIDER_COLUMN_ENTRY("FileName", 4, cFileName)
  24. PROVIDER_COLUMN_ENTRY("AltFileName", 5, cAlternateFileName)
  25. END_PROVIDER_COLUMN_MAP()
  26. };
  27. class CWinRegKey
  28. {
  29. public:
  30. BEGIN_PROVIDER_COLUMN_MAP(CWinRegKey)
  31. PROVIDER_COLUMN_ENTRY("Key Name", 1, m_szRegKey)
  32. END_PROVIDER_COLUMN_MAP()
  33. WCHAR m_szRegKey[256];
  34. };
  35. // CDirCommand
  36. class ATL_NO_VTABLE CDirCommand :
  37. public CComObjectRootEx<CComMultiThreadModel>,
  38. public IAccessorImpl<CDirCommand>,
  39. public ICommandTextImpl<CDirCommand>,
  40. public ICommandPropertiesImpl<CDirCommand>,
  41. public IObjectWithSiteImpl<CDirCommand>,
  42. public IConvertTypeImpl<CDirCommand>,
  43. public IColumnsInfoImpl<CDirCommand>
  44. {
  45. public:
  46. HRESULT FinalConstruct()
  47. {
  48. HRESULT hr = CConvertHelper::FinalConstruct();
  49. if (FAILED (hr))
  50. return hr;
  51. hr = IAccessorImpl<CDirCommand>::FinalConstruct();
  52. if (FAILED(hr))
  53. return hr;
  54. return CUtlProps<CDirCommand>::FInit();
  55. }
  56. void FinalRelease()
  57. {
  58. IAccessorImpl<CDirCommand>::FinalRelease();
  59. }
  60. HRESULT WINAPI Execute(IUnknown * pUnkOuter, REFIID riid, DBPARAMS * pParams,
  61.   LONG * pcRowsAffected, IUnknown ** ppRowset);
  62. static ATLCOLUMNINFO* GetColumnInfo(CDirCommand* pv, ULONG* pcInfo)
  63. {
  64. USES_CONVERSION;
  65. const int cbRegHeader = 5;
  66. TCHAR szRegHeader[cbRegHeader];
  67. CDirCommand* pCommand = (CDirCommand*)pv;
  68. lstrcpyn(szRegHeader, OLE2T(pCommand->m_strCommandText), cbRegHeader);
  69. if (lstrcmpi(szRegHeader, _T("REG:")) == 0)
  70. return CWinRegKey::GetColumnInfo(pv,pcInfo);
  71. else
  72. return CWindowsFile::GetColumnInfo(pv,pcInfo);
  73. }
  74. BEGIN_PROPSET_MAP(CDirCommand)
  75. BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
  76. PROPERTY_INFO_ENTRY(IAccessor)
  77. PROPERTY_INFO_ENTRY(IColumnsInfo)
  78. PROPERTY_INFO_ENTRY(IConvertType)
  79. PROPERTY_INFO_ENTRY(IRowset)
  80. PROPERTY_INFO_ENTRY(IRowsetIdentity)
  81. PROPERTY_INFO_ENTRY(IRowsetInfo)
  82. PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
  83. PROPERTY_INFO_ENTRY(CANHOLDROWS)
  84. PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
  85. END_PROPERTY_SET(DBPROPSET_ROWSET)
  86. END_PROPSET_MAP()
  87. BEGIN_COM_MAP(CDirCommand)
  88. COM_INTERFACE_ENTRY(ICommand)
  89. COM_INTERFACE_ENTRY(IObjectWithSite)
  90. COM_INTERFACE_ENTRY(IAccessor)
  91. COM_INTERFACE_ENTRY(ICommandProperties)
  92. COM_INTERFACE_ENTRY2(ICommandText, ICommand)
  93. COM_INTERFACE_ENTRY(IColumnsInfo)
  94. COM_INTERFACE_ENTRY(IConvertType)
  95. END_COM_MAP()
  96. public:
  97. };
  98. class CRegRowset : public CRowsetImpl<CRegRowset, CWinRegKey, CDirCommand>
  99. {
  100. public:
  101. static HKEY HKeyFromString(LPTSTR szToken)
  102. {
  103. struct keymap
  104. {
  105. LPCTSTR lpsz;
  106. HKEY hkey;
  107. };
  108. static const keymap map[] = {
  109. {_T("HKCR"), HKEY_CLASSES_ROOT},
  110. {_T("HKCU"), HKEY_CURRENT_USER},
  111. {_T("HKLM"), HKEY_LOCAL_MACHINE},
  112. {_T("HKU"),  HKEY_USERS},
  113. {_T("HKPD"), HKEY_PERFORMANCE_DATA},
  114. {_T("HKDD"), HKEY_DYN_DATA},
  115. {_T("HKCC"), HKEY_CURRENT_CONFIG},
  116. {_T("HKEY_CLASSES_ROOT"), HKEY_CLASSES_ROOT},
  117. {_T("HKEY_CURRENT_USER"), HKEY_CURRENT_USER},
  118. {_T("HKEY_LOCAL_MACHINE"), HKEY_LOCAL_MACHINE},
  119. {_T("HKEY_USERS"), HKEY_USERS},
  120. {_T("HKEY_PERFORMANCE_DATA"), HKEY_PERFORMANCE_DATA},
  121. {_T("HKEY_DYN_DATA"), HKEY_DYN_DATA},
  122. {_T("HKEY_CURRENT_CONFIG"), HKEY_CURRENT_CONFIG}
  123. };
  124. for (int i=0;i<sizeof(map)/sizeof(keymap);i++)
  125. {
  126. if (!lstrcmpi(szToken, map[i].lpsz))
  127. return map[i].hkey;
  128. }
  129. return NULL;
  130. }
  131. HRESULT Execute(DBPARAMS *, LONG* pcRowsAffected)
  132. {
  133. USES_CONVERSION;
  134. CWinRegKey wrk;
  135. LPTSTR szKeyBegin = OLE2T(&(m_strCommandText[4]));
  136. LPTSTR szRootKey, szSubKey;
  137. int cbKey = lstrlen(szKeyBegin);
  138. int i=0;
  139. while (szKeyBegin[i] != '\' && i < cbKey)
  140. i++;
  141. if (i < cbKey)
  142. {
  143. szRootKey = (TCHAR*)_alloca(sizeof(TCHAR)*(i+1));
  144. lstrcpyn(szRootKey, szKeyBegin, i+1);
  145. szSubKey = (TCHAR*)_alloca(sizeof(TCHAR)*(cbKey - i + 1));
  146. lstrcpy(szSubKey, szKeyBegin+i+1);
  147. }
  148. else
  149. {
  150. szRootKey = szKeyBegin;
  151. szSubKey = NULL;
  152. }
  153. HKEY hKey = CRegRowset::HKeyFromString(szRootKey);
  154. CRegKey rk;
  155. rk.Open(hKey, szSubKey, KEY_READ);
  156. DWORD dwIndex = 0;
  157. TCHAR szTemp[256];
  158. while (::RegEnumKey(rk.m_hKey,dwIndex, szTemp, 256) == ERROR_SUCCESS)
  159. {
  160. lstrcpyW(wrk.m_szRegKey, T2W(szTemp));
  161. if (!m_rgRowData.Add(wrk))
  162. return E_OUTOFMEMORY;
  163. dwIndex++;
  164. }
  165. if (pcRowsAffected != NULL)
  166. *pcRowsAffected = dwIndex;
  167. return S_OK;
  168. }
  169. };
  170. class CDirRowset :
  171. public CRowsetImpl< CDirRowset, CWindowsFile, CDirCommand>
  172. {
  173. public:
  174. // Implementation
  175. HRESULT ValidateCommandID(DBID* pTableID, DBID* pIndexID)
  176. {
  177. HRESULT hr = _RowsetBaseClass::ValidateCommandID(pTableID, pIndexID);
  178. if (hr != S_OK)
  179. return hr;
  180. if (pIndexID != NULL)
  181. return DB_E_NOINDEX;    // We don't support indexes
  182. return S_OK;
  183. }
  184. HRESULT Execute(DBPARAMS *, LONG* pcRowsAffected)
  185. {
  186. USES_CONVERSION;
  187. HANDLE hFile = INVALID_HANDLE_VALUE;
  188. LPTSTR  szDir = (m_strCommandText == _T("")) ? _T("*.*") : OLE2T(m_strCommandText);
  189. CWindowsFile wf;
  190. hFile = FindFirstFile(szDir, &wf);
  191. if (hFile == INVALID_HANDLE_VALUE)
  192. return DB_E_NOTABLE;
  193. LONG cFiles = 1;
  194. BOOL bMoreFiles = TRUE;
  195. while (bMoreFiles)
  196. {
  197. if (!m_rgRowData.Add(wf))
  198. return E_OUTOFMEMORY;
  199. bMoreFiles = FindNextFile(hFile, &wf);
  200. cFiles++;
  201. }
  202. FindClose(hFile);
  203. if (pcRowsAffected != NULL)
  204. *pcRowsAffected = cFiles;
  205. return S_OK;
  206. }
  207. };
  208. #endif //__ROWSET_H_