enum.cpp
上传用户:xhy777
上传日期:2007-02-14
资源大小:24088k
文件大小:10k
源码类别:

系统编程

开发平台:

Visual C++

  1. #include "enum.h"
  2. BOOL GetVersion(LPCONTROLPIDL pcpidl, LPTSTR lpszBuf);
  3. BOOL GetTimeInfo(
  4.                BOOL bCreation, LPCONTROLPIDL pcpidl, 
  5.                FILETIME* lpTime, LPTSTR lpszBuf, BOOL bShowTime);
  6. // Also defined in ntprivateineturlmonisctrl.cxx
  7. const TCHAR *g_pszLastCheckDateKey = "LastCheckDate";
  8. const TCHAR *g_pszUpdateInfo = "UpdateInfo";
  9. ///////////////////////////////////////////////////////////////////////////////
  10. // IEnumIDList methods
  11. CControlFolderEnum::CControlFolderEnum(STRRET &str, LPCITEMIDLIST pidl, UINT shcontf) :
  12.     m_shcontf(shcontf)
  13. {
  14.     DebugMsg(DM_TRACE, TEXT("cfe - CControlFolderEnum() called"));
  15.     m_cRef = 1;
  16.     DllAddRef();
  17.     m_bEnumStarted = FALSE;
  18.     m_hEnumControl = NULL;
  19.     StrRetToBuf(&str, pidl, m_szCachePath, MAX_PATH);
  20.     SHGetMalloc(&m_pMalloc);          // won't fail
  21. }
  22. CControlFolderEnum::~CControlFolderEnum()
  23. {
  24.     Assert(m_cRef == 0);         // we should always have a zero ref count here
  25.     DebugMsg(DM_TRACE, TEXT("cfe - ~CControlFolderEnum() called."));
  26.     DllRelease();
  27. }
  28. HRESULT CControlFolderEnum_CreateInstance(
  29.                                       LPITEMIDLIST pidl, 
  30.                                       UINT shcontf,
  31.                                       LPENUMIDLIST *ppeidl)
  32. {
  33.     DebugMsg(DM_TRACE,("cfe - CreateInstance() called."));
  34.     if (pidl == NULL)
  35.         return HRESULT_FROM_WIN32(ERROR_BAD_ARGUMENTS);
  36.     HRESULT hr;
  37.     LPSHELLFOLDER pshf = NULL;
  38.     if (FAILED(hr = SHGetDesktopFolder(&pshf)))
  39.         return hr;
  40.     STRRET name;
  41.     hr = pshf->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &name);
  42.     if (FAILED(hr))
  43.         return hr;
  44.     *ppeidl = NULL;                 // null the out param
  45.     CControlFolderEnum *pCFE = new CControlFolderEnum(name, pidl, shcontf);
  46.     if (!pCFE)
  47.         return E_OUTOFMEMORY;
  48.     
  49.     *ppeidl = pCFE;
  50.     return S_OK;
  51. }
  52. BOOL GetVersion(LPCONTROLPIDL pcpidl, LPTSTR lpszBuf)
  53. {
  54.     Assert(pcpidl != NULL);
  55.     LPCTSTR pszLocation = GetStringInfo(pcpidl, SI_LOCATION);
  56.     DWORD dwBufLen;
  57.         DWORD dwHandle;
  58.         LPVOID lpvData;
  59.         BOOL fResult = FALSE;
  60.         UINT uLen;
  61.         VS_FIXEDFILEINFO *pVersionInfo = NULL;
  62.     // Quick copy to handle failure cases
  63.     lstrcpy(lpszBuf, g_szUnknownData);
  64.         if ((dwBufLen = ::GetFileVersionInfoSize(
  65.                                         (LPTSTR)pszLocation, 
  66.                                         &dwHandle)) == 0)
  67.         return FALSE;
  68.         lpvData = (LPVOID) new BYTE[dwBufLen];
  69.         Assert(lpvData);
  70.         if (lpvData == NULL)
  71.                 return FALSE;
  72.         if (GetFileVersionInfo(
  73.                        (LPTSTR)pszLocation,     
  74.                        dwHandle, 
  75.                        dwBufLen,
  76.                        lpvData))
  77.         {
  78.                 fResult = VerQueryValue(lpvData, "\", (LPVOID*)&pVersionInfo, &uLen);
  79.                 
  80.                 if (fResult)
  81.                 {
  82.                         wsprintf(lpszBuf, "%d,%d,%d,%d",
  83.                                 (pVersionInfo->dwFileVersionMS & 0xffff0000)>>16,
  84.                                 (pVersionInfo->dwFileVersionMS & 0xffff),
  85.                                 (pVersionInfo->dwFileVersionLS & 0xffff0000)>>16,
  86.                                 (pVersionInfo->dwFileVersionLS & 0xffff));
  87.                 }
  88.         }
  89.         delete (BYTE*)lpvData;
  90.     return fResult;
  91. }
  92. BOOL GetTimeInfo(
  93.              BOOL bCreation, 
  94.              LPCONTROLPIDL pcpidl, 
  95.              FILETIME* lpTime,
  96.              LPTSTR lpszBuf,
  97.              BOOL bShowTime)
  98. {
  99.     Assert(pcpidl != NULL);
  100.         Assert (lpszBuf != NULL);
  101.     if (pcpidl == NULL || lpszBuf == NULL)
  102.         return FALSE;
  103.     LPCTSTR pszLocation = GetStringInfo(pcpidl, SI_LOCATION);
  104.     BOOL fResult = TRUE;
  105.     HANDLE hFile = NULL;
  106.         WIN32_FIND_DATA findFileData;
  107.         TCHAR szTime[TIMESTAMP_MAXSIZE];
  108.     TCHAR szDate[TIMESTAMP_MAXSIZE];
  109.         SYSTEMTIME sysTime;
  110.         FILETIME localTime;
  111.         hFile = FindFirstFile(pszLocation, &findFileData);
  112.     if (hFile != INVALID_HANDLE_VALUE)
  113.     {
  114.                 // Get the creation time and date information.
  115.         if (bCreation)
  116.         {
  117.             *lpTime = findFileData.ftCreationTime;
  118.                     FileTimeToLocalFileTime(&findFileData.ftCreationTime, &localTime);
  119.         }
  120.         else
  121.         {
  122.             *lpTime = findFileData.ftLastAccessTime;
  123.                     FileTimeToLocalFileTime(&findFileData.ftLastAccessTime, &localTime);
  124.         }
  125.         FileTimeToSystemTime(&localTime, &sysTime);
  126.         GetDateFormat(
  127.             LOCALE_SYSTEM_DEFAULT,
  128.             DATE_SHORTDATE,
  129.             &sysTime,
  130.             NULL,
  131.             szDate,
  132.             TIMESTAMP_MAXSIZE);
  133.         lstrcpy(lpszBuf, szDate);
  134.         if (bShowTime)
  135.         {
  136.             GetTimeFormat(
  137.                 LOCALE_SYSTEM_DEFAULT,
  138.                 TIME_NOSECONDS,
  139.                 &sysTime,
  140.                 NULL,
  141.                 szTime,
  142.                 TIMESTAMP_MAXSIZE
  143.                 );
  144.             lstrcat(lpszBuf, TEXT(" "));
  145.             lstrcat(lpszBuf, szTime);
  146.         }
  147.             FindClose(hFile);
  148.     }
  149.     else
  150.     {
  151.         fResult = FALSE;
  152.         lstrcpy(lpszBuf, g_szUnknownData);
  153.         lpTime->dwLowDateTime = lpTime->dwHighDateTime = 0;
  154.     }
  155.         return fResult;
  156. }
  157. LPCONTROLPIDL CreateControlPidl(IMalloc *pmalloc, HANDLE hControl)
  158. {
  159.     Assert(pmalloc != NULL);
  160.     DWORD dw;
  161.     GetControlInfo(hControl, GCI_TOTALFILES, &dw, NULL, 0);
  162.     ULONG ulSize = sizeof(CONTROLPIDL) + sizeof(USHORT);
  163.     ulSize += (dw - 1) * sizeof(DEPENDENTFILEINFO);
  164.     LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)pmalloc->Alloc(ulSize);
  165.     if (pcpidl)
  166.     {
  167.         memset(pcpidl, 0, ulSize);
  168.         pcpidl->cb = (USHORT)(ulSize - sizeof(USHORT));
  169.         pcpidl->ci.cTotalFiles = (UINT)dw;
  170.         GetControlInfo(hControl, GCI_TOTALSIZE, &(pcpidl->ci.dwTotalFileSize), NULL, 0);
  171.         GetControlInfo(hControl, GCI_SIZESAVED, &(pcpidl->ci.dwTotalSizeSaved), NULL, 0);
  172.         GetControlInfo(hControl, GCI_NAME, NULL, pcpidl->ci.szName, CONTROLNAME_MAXSIZE);
  173.         GetControlInfo(hControl, GCI_FILE, NULL, pcpidl->ci.szFile, MAX_PATH);
  174.         GetControlInfo(hControl, GCI_CLSID, NULL, pcpidl->ci.szCLSID, MAX_CLSID_LEN);
  175.         GetControlInfo(hControl, GCI_TYPELIBID, NULL, pcpidl->ci.szTypeLibID, MAX_CLSID_LEN);
  176.         GetTimeInfo(TRUE, pcpidl, &(pcpidl->ci.timeCreation), pcpidl->ci.szCreation, TRUE);
  177.         GetTimeInfo(FALSE, pcpidl, &(pcpidl->ci.timeLastAccessed), pcpidl->ci.szLastAccess, FALSE);
  178.         GetControlInfo(hControl, GCI_CODEBASE, NULL, pcpidl->ci.szCodeBase, INTERNET_MAX_URL_LENGTH);
  179.         GetControlInfo(hControl, GCI_ISDISTUNIT, &(pcpidl->ci.dwIsDistUnit), NULL, 0);
  180.         GetControlInfo(hControl, GCI_STATUS, &(pcpidl->ci.dwStatus), NULL, 0);
  181.         GetControlInfo(hControl, GCI_HAS_ACTIVEX, &(pcpidl->ci.dwHasActiveX), NULL, 0);
  182.         GetControlInfo(hControl, GCI_HAS_JAVA, &(pcpidl->ci.dwHasJava), NULL, 0);
  183.         if (pcpidl->ci.dwIsDistUnit)
  184.         {
  185.             GetControlInfo(hControl, GCI_DIST_UNIT_VERSION, NULL, pcpidl->ci.szVersion, VERSION_MAXSIZE);
  186.         }
  187.         else
  188.         {
  189.             GetVersion(pcpidl, pcpidl->ci.szVersion);
  190.         }
  191.         LONG lResult = ERROR_SUCCESS;
  192.         LPDEPENDENTFILEINFO pInfo = &(pcpidl->ci.dependentFile);
  193.         dw = GetTotalNumOfFiles(pcpidl);
  194.         for (UINT iFile = 0;;)
  195.         {
  196.             lResult = GetControlDependentFile(
  197.                                        iFile,
  198.                                        hControl,
  199.                                        pInfo->szFile,
  200.                                        &(pInfo->dwSize),
  201.                                        TRUE);
  202.             Assert(lResult == ERROR_SUCCESS);
  203.             if ((++iFile >= (UINT)dw) || (lResult != ERROR_SUCCESS))
  204.                 break;
  205.             pInfo = (LPDEPENDENTFILEINFO)(pInfo + 1);
  206.         }
  207.     }
  208.     return pcpidl;
  209. }
  210. //////////////////////////////////
  211. //
  212. // IUnknown Methods...
  213. //
  214. HRESULT CControlFolderEnum::QueryInterface(REFIID iid,void **ppv)
  215. {
  216.     DebugMsg(DM_TRACE, TEXT("cfe - QueryInterface called."));
  217.     
  218.     if ((iid == IID_IEnumIDList) || (iid == IID_IUnknown))
  219.     {
  220.         *ppv = (void *)this;
  221.         AddRef();
  222.         return S_OK;
  223.     }
  224.     
  225.     *ppv = NULL;
  226.     return E_NOINTERFACE;
  227. }
  228. ULONG CControlFolderEnum::AddRef(void)
  229. {
  230.     return ++m_cRef;
  231. }
  232. ULONG CControlFolderEnum::Release(void)
  233. {
  234.     if (--m_cRef)
  235.         return m_cRef;
  236.     delete this;
  237.     return 0;
  238. }
  239. HRESULT CControlFolderEnum::Next(
  240.                              ULONG celt, 
  241.                              LPITEMIDLIST *rgelt, 
  242.                              ULONG *pceltFetched)
  243. {
  244.     DebugMsg(DM_TRACE, TEXT("cfe - Next() called."));
  245.     // If asking for stuff we don't have, say we don't have any
  246.     if (!(m_shcontf & SHCONTF_NONFOLDERS))
  247.         return S_FALSE;
  248.     LONG lres = ERROR_SUCCESS;
  249.     HANDLE hControl = NULL;
  250.     LPCONTROLPIDL pcpidl = NULL;
  251.     lres = (!m_bEnumStarted ? 
  252.                   FindFirstControl(m_hEnumControl, hControl, m_szCachePath) :
  253.                   FindNextControl(m_hEnumControl, hControl));
  254.     if (pceltFetched)
  255.         *pceltFetched = (lres == ERROR_SUCCESS ? 1 : 0);
  256.     if (lres != ERROR_SUCCESS)
  257.         goto EXIT_NEXT;
  258.     pcpidl = CreateControlPidl(m_pMalloc, hControl);
  259.     if (pcpidl == NULL)
  260.     {
  261.         lres = ERROR_NOT_ENOUGH_MEMORY;
  262.         goto EXIT_NEXT;
  263.     }
  264.     m_bEnumStarted = TRUE;
  265.     rgelt[0] = (LPITEMIDLIST)pcpidl;
  266. EXIT_NEXT:
  267.     ReleaseControlHandle(hControl);
  268.     if (lres != ERROR_SUCCESS)
  269.     {
  270.         if (pcpidl != NULL)
  271.         {
  272.             m_pMalloc->Free(pcpidl);
  273.             pcpidl = NULL;
  274.         }
  275.         FindControlClose(m_hEnumControl);
  276.         m_bEnumStarted = FALSE;
  277.         rgelt[0] = NULL;
  278.     }
  279.     return HRESULT_FROM_WIN32(lres);
  280. }
  281. HRESULT CControlFolderEnum::Skip(ULONG celt)
  282. {
  283.     DebugMsg(DM_TRACE, TEXT("cfe - Skip() called."));
  284.     return E_NOTIMPL;
  285. }
  286. HRESULT CControlFolderEnum::Reset()
  287. {
  288.     DebugMsg(DM_TRACE, TEXT("cfe - Reset() called."));
  289.     return E_NOTIMPL;
  290. }
  291. HRESULT CControlFolderEnum::Clone(IEnumIDList **ppenum)
  292. {
  293.     DebugMsg(DM_TRACE, TEXT("cfe - Clone() called."));
  294.     return E_NOTIMPL;
  295. }