#include #include "item.h" #include #include "utils.h" #include "parseinf.h" #include extern "C" HRESULT GetControlFolderPath(LPTSTR lpszDir, ULONG ulSizeBuf); typedef HRESULT (STDAPICALLTYPE *PFNASYNCINSTALLDU)(LPCWSTR,LPCWSTR, LPCWSTR, DWORD, DWORD,LPCWSTR, IBindCtx *, LPVOID, DWORD ); // registered clipboard formats //UINT g_cfFileDescriptor = 0; //UINT g_cfFileContents = 0; //UINT g_cfURL = 0; UINT g_cfPrefDropEffect = 0; /////////////////////////////////////////////////////////////////////////////// // CControlItem methods. CControlItem::CControlItem() { DebugMsg(DM_TRACE, TEXT("ci - CControlItem() called.")); DllAddRef(); m_cRef = 1; m_piciUpdate = NULL; m_pcpidlUpdate = NULL; m_pcdlbsc = NULL; } CControlItem::~CControlItem() { Assert(m_cRef == 0); // we should have zero ref count here DebugMsg(DM_TRACE, TEXT("ci - ~CControlItem() called.")); LocalFree((HLOCAL)m_ppcei); if (m_pCFolder != NULL) m_pCFolder->Release(); // release the pointer to the sf DllRelease(); } HRESULT CControlItem::Initialize(CControlFolder *pCFolder, UINT cidl, LPCITEMIDLIST *ppidl) { m_ppcei = (LPCONTROLPIDL*)LocalAlloc(LPTR, cidl * sizeof(LPCONTROLPIDL)); if (m_ppcei == NULL) return E_OUTOFMEMORY; m_cItems = cidl; m_pCFolder = pCFolder; for (UINT i = 0; i < cidl; i++) m_ppcei[i] = (LPCONTROLPIDL)(ppidl[i]); m_pCFolder->AddRef(); // we're going to hold onto this pointer, so // we need to AddRef it. return NOERROR; } HRESULT CControlItem_CreateInstance( CControlFolder *pCFolder, UINT cidl, LPCITEMIDLIST *ppidl, REFIID riid, void **ppvOut) { *ppvOut = NULL; // null the out param // if (!_ValidateIDListArray(cidl, ppidl)) // return E_FAIL; CControlItem *pCItem = new CControlItem; if (pCItem == NULL) return E_OUTOFMEMORY; HRESULT hr = pCItem->Initialize(pCFolder, cidl, ppidl); if (SUCCEEDED(hr)) { hr = pCItem->QueryInterface(riid, ppvOut); } pCItem->Release(); if (g_cfPrefDropEffect == 0) { // g_cfFileDescriptor = RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR); // "FileContents" // g_cfFileContents = RegisterClipboardFormat(CFSTR_FILECONTENTS); // "FileDescriptor" // g_cfURL = RegisterClipboardFormat(TEXT("UniformResourceLocator")); // "UniformResourceLocator" g_cfPrefDropEffect = RegisterClipboardFormat(TEXT("Preferred DropEffect"));// "Preferred DropEffect" } return hr; } HRESULT CControlItem::QueryInterface(REFIID iid, void **ppv) { DebugMsg(DM_TRACE, TEXT("ci - QueryInterface() called.")); if ((iid == IID_IUnknown) || (iid == IID_IContextMenu)) { *ppv = (LPVOID)(IContextMenu*)this; } else if (iid == IID_IDataObject) { *ppv = (LPVOID)(IDataObject*)this; } else if (iid == IID_IExtractIcon) { *ppv = (LPVOID)(IExtractIcon*)this; } else if (iid == CLSID_ControlFolder) // really should be CLSID_ControlFolderItem { *ppv = (void *)this; // for our friends } else { *ppv = NULL; // null the out param return E_NOINTERFACE; } AddRef(); return S_OK; } ULONG CControlItem::AddRef() { return ++m_cRef; } ULONG CControlItem::Release() { if (--m_cRef) return m_cRef; delete this; return 0; } HRESULT CControlItem::GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM) { HRESULT hres; #ifdef _DEBUG_ TCHAR szName[64]; if (!GetClipboardFormatName(pFEIn->cfFormat, szName, sizeof(szName))) wsprintf(szName, "#%d", pFEIn->cfFormat); DebugMsg(DM_TRACE, TEXT("ci - do - GetData(%s)"), szName); #endif pSTM->hGlobal = NULL; pSTM->pUnkForRelease = NULL; if ((pFEIn->cfFormat == g_cfPrefDropEffect) && (pFEIn->tymed & TYMED_HGLOBAL)) hres = CreatePrefDropEffect(pSTM); else hres = E_FAIL; // FAIL WHEN YOU DON'T SUPPORT IT!!! return hres; } HRESULT CControlItem::GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM) { DebugMsg(DM_TRACE, TEXT("ci - do - GetDataHere() called.")); return E_NOTIMPL; } HRESULT CControlItem::QueryGetData(LPFORMATETC pFEIn) { #ifdef _DEBUG_ TCHAR szName[64]; if (!GetClipboardFormatName(pFEIn->cfFormat, szName, sizeof(szName))) wsprintf(szName, "#%d", pFEIn->cfFormat); DebugMsg(DM_TRACE, TEXT("ci - do - QueryGetData(%s)"), szName); #endif if (pFEIn->cfFormat == g_cfPrefDropEffect) { DebugMsg(DM_TRACE, TEXT(" format supported.")); return NOERROR; } return S_FALSE; } HRESULT CControlItem::GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut) { DebugMsg(DM_TRACE, TEXT("ci - do - GetCanonicalFormatEtc() called.")); return DATA_S_SAMEFORMATETC; } HRESULT CControlItem::SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL fRelease) { DebugMsg(DM_TRACE,TEXT("ci - do - SetData() called.")); return E_NOTIMPL; } HRESULT CControlItem::EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum) { FORMATETC ControlFmte[1] = { {(CLIPFORMAT)g_cfPrefDropEffect, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL} }; DebugMsg(DM_TRACE, TEXT("ci - do - EnumFormatEtc() called.")); return SHCreateStdEnumFmtEtc(ARRAYSIZE(ControlFmte), ControlFmte, ppEnum); } HRESULT CControlItem::DAdvise(LPFORMATETC pFE, DWORD grfAdv, LPADVISESINK pAdvSink, LPDWORD pdwConnection) { DebugMsg(DM_TRACE, TEXT("ci - do - DAdvise() called.")); return OLE_E_ADVISENOTSUPPORTED; } HRESULT CControlItem::DUnadvise(DWORD dwConnection) { DebugMsg(DM_TRACE, TEXT("ci - do - DUnAdvise() called.")); return OLE_E_ADVISENOTSUPPORTED; } HRESULT CControlItem::EnumDAdvise(LPENUMSTATDATA *ppEnum) { DebugMsg(DM_TRACE, TEXT("ci - do - EnumAdvise() called.")); return OLE_E_ADVISENOTSUPPORTED; } HRESULT CControlItem::CreatePrefDropEffect(LPSTGMEDIUM pSTM) { pSTM->tymed = TYMED_HGLOBAL; pSTM->pUnkForRelease = NULL; pSTM->hGlobal = GlobalAlloc(GPTR, sizeof(DWORD)); if (pSTM->hGlobal) { *((LPDWORD)pSTM->hGlobal) = DROPEFFECT_COPY; return S_OK; } return E_OUTOFMEMORY; } HRESULT CControlItem::Remove(HWND hwnd) { TCHAR szMsg[MESSAGE_MAXSIZE]; TCHAR szBuf[MESSAGE_MAXSIZE]; if ( !g_fAllAccess ) { // The current user does not have the access privileges to modify the // keys we need to tweak to remove a control, so let 'em know and bail // out quickly. MLLoadString(IDS_WARNING_USERNOACCESS, szMsg, ARRAYSIZE(szMsg)); MLLoadString(IDS_MBTITLE_REMOVECONTROL, szBuf, ARRAYSIZE(szBuf)); MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONWARNING); return S_FALSE; } szMsg[0] = '\0'; if (m_cItems == 1) { // if(!PathFileExists(GetStringInfo(m_ppcei[0], SI_LOCATION)) || // IsModuleRemovable(GetStringInfo(m_ppcei[0], SI_LOCATION))) { MLLoadString(IDS_WARNING_SINGLEREMOVAL, szBuf, ARRAYSIZE(szBuf)); wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[0], SI_CONTROL)); } } else { MLLoadString(IDS_WARNING_MULTIPLEREMOVAL, szMsg, ARRAYSIZE(szMsg)); } if (szMsg[0] != '\0') { MLLoadString(IDS_MBTITLE_REMOVECONTROL, szBuf, ARRAYSIZE(szBuf)); if (MessageBox(hwnd, szMsg, szBuf, MB_YESNO | MB_ICONWARNING) != IDYES) { return S_FALSE; } } // set wait cursor HRESULT hr = S_OK; HCURSOR hCurOld = StartWaitCur(); LPCTSTR pszTypeLibId = NULL; for (UINT i = 0; i < m_cItems; i++) { Assert(m_ppcei[i] != NULL); if (m_ppcei[i] == NULL) { hr = E_FAIL; break; } pszTypeLibId = GetStringInfo(m_ppcei[i], SI_TYPELIBID); if (SUCCEEDED(hr = RemoveControlByName2( GetStringInfo(m_ppcei[i], SI_LOCATION), GetStringInfo(m_ppcei[i], SI_CLSID), (pszTypeLibId[0] == '\0' ? NULL : pszTypeLibId), TRUE, (m_ppcei[i])->ci.dwIsDistUnit, FALSE))) { if ( hr == S_FALSE ) { MLLoadString( IDS_ERROR_NOUNINSTALLACTION, szBuf, ARRAYSIZE(szBuf)); wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[i], SI_CONTROL)); MLLoadString( IDS_MBTITLE_NOUNINSTALLACTION, szBuf, ARRAYSIZE(szBuf)); MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONWARNING); } GenerateEvent( SHCNE_DELETE, m_pCFolder->m_pidl, (LPITEMIDLIST)(m_ppcei[i]), NULL); } else if (hr == STG_E_SHAREVIOLATION) { MLLoadString( IDS_CONTROL_INUSE, szBuf, ARRAYSIZE(szBuf)); wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[i], SI_CONTROL)); MLLoadString( IDS_MBTITLE_SHAREVIOLATION, szBuf, ARRAYSIZE(szBuf)); MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONSTOP); } else { MLLoadString( IDS_ERROR_REMOVEFAIL, szBuf, ARRAYSIZE(szBuf)); wsprintf(szMsg, szBuf, GetStringInfo(m_ppcei[i], SI_CONTROL)); MLLoadString( IDS_MBTITLE_REMOVEFAIL, szBuf, ARRAYSIZE(szBuf)); MessageBox(hwnd, szMsg, szBuf, MB_OK|MB_ICONSTOP); break; } } EndWaitCur(hCurOld); return hr; } /////////////////////////////////////////////////////////////////////////////// // IExtractIcon Methods STDMETHODIMP CControlItem::GetIconLocation( UINT uFlags, LPSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) { Assert(szIconFile != NULL); Assert(m_cItems == 1); if (szIconFile == NULL) return S_FALSE; *piIndex = 0; *pwFlags = 0; if (uFlags != GIL_FORSHELL) return S_FALSE; *pwFlags = GIL_NOTFILENAME|GIL_PERINSTANCE; if (cchMax > (UINT)lstrlen(GetStringInfo(m_ppcei[0], SI_LOCATION))) { lstrcpy(szIconFile, GetStringInfo(m_ppcei[0], SI_LOCATION)); return NOERROR; } szIconFile[0] = '\0'; return S_FALSE; } STDMETHODIMP CControlItem::Extract( LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) { *phiconLarge = ExtractIcon(g_hInst, pszFile, nIconIndex); if (*phiconLarge == NULL) { *phiconLarge = GetDefaultOCIcon( m_ppcei[0] ); Assert(*phiconLarge != NULL); } *phiconSmall = *phiconLarge; return NOERROR; } /////////////////////////////////////////////////////////////////////////////// // IContextMenu Methods const struct { LPCTSTR pszVerb; UINT idCmd; } rgcmds[] = { {TEXT("Remove"), IDM_CTRL_REMOVECONTROL}, {TEXT("Properties"), IDM_CTRL_PROPERTIES}, {TEXT("Update"), IDM_CTRL_UPDATE}, {TEXT("Delete"), IDM_CTRL_REMOVECONTROL}, {NULL, 0} // terminator }; int GetCmdID(LPCTSTR pszCmd) { if ((DWORD_PTR)pszCmd <= 0xFFFF) return (int)LOWORD(pszCmd); for (int i = 0; rgcmds[i].pszVerb != NULL; i++) if (lstrcmpi(pszCmd, rgcmds[i].pszVerb) == 0) return rgcmds[i].idCmd; return -1; } HMENU LoadPopupMenu(UINT id, UINT uSubOffset) { HMENU hmParent, hmPopup; hmParent = LoadMenu(MLGetHinst(), MAKEINTRESOURCE(id)); if (!hmParent) return NULL; hmPopup = GetSubMenu(hmParent, uSubOffset); RemoveMenu(hmParent, uSubOffset, MF_BYPOSITION); DestroyMenu(hmParent); return hmPopup; } UINT MergePopupMenu( HMENU *phMenu, UINT idResource, UINT uSubOffset, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast) { HMENU hmMerge; if (*phMenu == NULL) { *phMenu = CreatePopupMenu(); if (*phMenu == NULL) return 0; indexMenu = 0; // at the bottom } hmMerge = LoadPopupMenu(idResource, uSubOffset); if (!hmMerge) return 0; idCmdLast = Shell_MergeMenus(*phMenu, hmMerge, indexMenu, idCmdFirst, idCmdLast, MM_ADDSEPARATOR); DestroyMenu(hmMerge); return idCmdLast; } HRESULT CControlItem::QueryContextMenu( HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { UINT idLastMerged = 0; DebugMsg(DM_TRACE, TEXT("ci - cm - QueryContextMenu() called.")); if (uFlags & CMF_DVFILE) { idLastMerged = MergePopupMenu( &hmenu, IDR_FILE_MERGE, 0, indexMenu, idCmdFirst, idCmdLast); if (IsShowAllFilesEnabled()) { CheckMenuItem(hmenu, 1, MF_BYPOSITION | MF_CHECKED); } else { CheckMenuItem(hmenu, 1, MF_BYPOSITION | MF_UNCHECKED); } } else if (!(uFlags & CMF_VERBSONLY)) { DWORD dwState = 0; // Must have a connection and not be working offline to be able // to update. if (InternetGetConnectedState(&dwState, 0) && !IsGlobalOffline()) { idLastMerged = MergePopupMenu( &hmenu, IDR_POPUP_CONTROLCONTEXT, 0, indexMenu, idCmdFirst, idCmdLast); } else { idLastMerged = MergePopupMenu( &hmenu, IDR_POPUP_CONTROLCONTEXT_NO_UPDATE, 0, indexMenu, idCmdFirst, idCmdLast); } SetMenuDefaultItem(hmenu, idLastMerged - idCmdFirst, MF_BYPOSITION); // make the last menu, Properties, the default } return ResultFromShort(idLastMerged - idCmdFirst); // number of menu items } HRESULT CControlItem::InvokeCommand(LPCMINVOKECOMMANDINFO pici) { UINT i; int idCmd = GetCmdID((LPCTSTR)(pici->lpVerb)); HRESULT hres = S_OK; // LPOLESTR szMimeType = NULL; // LPOLESTR szExtension = NULL; // LPOLESTR szCodeBase = NULL; // IBindCtx *pbc = NULL; // CodeDownloadBSC *pCDLBSC = NULL; DebugMsg(DM_TRACE, TEXT("ci - cm - InvokeCommand() called.")); if (idCmd == IDM_CTRL_REMOVECONTROL) { hres = Remove(pici->hwnd); } else if (idCmd == IDM_CTRL_SHOWALL) { ToggleShowAllFiles(); GenerateEvent(SHCNE_UPDATEITEM, m_pCFolder->m_pidl, 0, NULL); } else { for (i = 0; i < m_cItems && SUCCEEDED(hres); i++) if (m_ppcei[i]) { switch (idCmd) { case IDM_CTRL_PROPERTIES: hres = CreatePropDialog(pici->hwnd, m_ppcei[i]); break;; case IDM_CTRL_UPDATE: hres = Update( pici, m_ppcei[i] ); /* hres = CreateBindCtx(0, &pbc); if (SUCCEEDED(hres)) { LPITEMIDLIST pidlUpdate = ILCombine(m_pCFolder->m_pidl,(LPITEMIDLIST)(m_ppcei[i])); // destructor of CodeDownloadBSC will free pidlUpdate if ( pidlUpdate != NULL && (pCDLBSC = new CodeDownloadBSC( pici->hwnd, pidlUpdate )) != NULL && SUCCEEDED(hres = RegisterBindStatusCallback(pbc, pCDLBSC, NULL, 0))) { PFNASYNCINSTALLDU pfnAsyncInstallDU; HINSTANCE hModule; pCDLBSC->Release(); hModule = LoadLibrary("URLMON.DLL"); #ifdef UNICODE WCHAR swzCodeBase = (m_ppcei[i])->ci.szCodeBase; WCHAR swzDUName = (m_ppcei[i])->ci.szCLSID; #else MAKE_WIDEPTR_FROMANSI(swzCodeBase, (m_ppcei[i])->ci.szCodeBase); MAKE_WIDEPTR_FROMANSI(swzDUName, (m_ppcei[i])->ci.szCLSID); #endif pfnAsyncInstallDU = (PFNASYNCINSTALLDU)GetProcAddress((HMODULE)hModule, "AsyncInstallDistributionUnit"); pfnAsyncInstallDU( swzDUName, szMimeType, szExtension, 0xFFFFFFFF, 0xFFFFFFFF, swzCodeBase, pbc, NULL, 0); FreeLibrary(hModule); } else { if ( pCDLBSC != NULL ) delete pCDLBSC; else if ( pidlUpdate != NULL ) ILFree( pidlUpdate ); } if (pbc != NULL) { pbc->Release(); } } */ break; default: hres = E_FAIL; break; } } } return hres; } HRESULT CControlItem::GetCommandString( UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPTSTR pszName, UINT cchMax) { HRESULT hres = E_FAIL; DebugMsg(DM_TRACE, TEXT("ci - cm - GetCommandString() called.")); pszName[0] = '\0'; if (uFlags == GCS_VERB) { for (int i = 0; rgcmds[i].pszVerb != NULL; i++) if (idCmd == rgcmds[i].idCmd) { lstrcpyn(pszName, rgcmds[i].pszVerb, cchMax); hres = NOERROR; } } else if (uFlags == GCS_HELPTEXT) { hres = NOERROR; switch (idCmd) { case IDM_CTRL_REMOVECONTROL: MLLoadString(IDS_HELP_REMOVECONTROL, pszName, cchMax); break; case IDM_CTRL_PROPERTIES: MLLoadString(IDS_HELP_PROPERTIES, pszName, cchMax); break; case IDM_CTRL_UPDATE: MLLoadString(IDS_HELP_UPDATE, pszName, cchMax); break; default: hres = E_FAIL; } } return hres; } HRESULT CControlItem::Update(LPCMINVOKECOMMANDINFO pici, LPCONTROLPIDL pcpidl ) { HRESULT hres = NOERROR; m_piciUpdate = pici; m_pcpidlUpdate = pcpidl; if (pici->hwnd) { INT_PTR nRes = DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_OCUPDATE), pici->hwnd, CControlItem::DlgProc, (LPARAM)this); } return hres; } INT_PTR CControlItem::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL fRet = TRUE; CControlItem* pctlitem = (CControlItem*)GetWindowLongPtr(hDlg, DWLP_USER); HRESULT hr = S_OK; IBindCtx *pbc = NULL; LPOLESTR szMimeType = NULL; LPOLESTR szExtension = NULL; TCHAR szBuf[MESSAGE_MAXSIZE]; switch (msg) { case WM_INITDIALOG: SetWindowLongPtr(hDlg, DWLP_USER, lParam); pctlitem = (CControlItem*)lParam; MLLoadString(IDS_UPDATE_CAPTION, szBuf, ARRAYSIZE(szBuf)); lstrcatn( szBuf, pctlitem->m_pcpidlUpdate->ci.szName, ARRAYSIZE(szBuf)); SetWindowText( hDlg, szBuf ); hr = CreateBindCtx(0, &pbc); if (SUCCEEDED(hr)) { LPITEMIDLIST pidlUpdate = ILCombine(pctlitem->m_pCFolder->m_pidl,(LPITEMIDLIST)(pctlitem->m_pcpidlUpdate)); // destructor of CodeDownloadBSC will free pidlUpdate // if new succeeds but register fails, we'll deallocate pidlUpdate twice. if ( pidlUpdate != NULL && (pctlitem->m_pcdlbsc = new CodeDownloadBSC( pctlitem->m_piciUpdate->hwnd, hDlg, pidlUpdate )) != NULL && SUCCEEDED(hr = RegisterBindStatusCallback(pbc, pctlitem->m_pcdlbsc, NULL, 0))) { PFNASYNCINSTALLDU pfnAsyncInstallDU; HINSTANCE hModule; hModule = LoadLibrary("URLMON.DLL"); #ifdef UNICODE WCHAR swzCodeBase = pctlitem->m_pcpidlUpdate->ci.szCodeBase; WCHAR swzDUName = pctlitem->m_pcpidlUpdate->ci.szCLSID; #else MAKE_WIDEPTR_FROMANSI(swzCodeBase, pctlitem->m_pcpidlUpdate->ci.szCodeBase); MAKE_WIDEPTR_FROMANSI(swzDUName, pctlitem->m_pcpidlUpdate->ci.szCLSID); #endif pfnAsyncInstallDU = (PFNASYNCINSTALLDU)GetProcAddress((HMODULE)hModule, "AsyncInstallDistributionUnit"); if ( pfnAsyncInstallDU != NULL ) hr = pfnAsyncInstallDU( swzDUName, szMimeType, szExtension, 0xFFFFFFFF, 0xFFFFFFFF, swzCodeBase, pbc, NULL, 0); else hr = E_FAIL; FreeLibrary(hModule); } else { if ( pctlitem->m_pcdlbsc != NULL ) { delete pctlitem->m_pcdlbsc; pctlitem->m_pcdlbsc = NULL; } else if ( pidlUpdate != NULL ) ILFree( pidlUpdate ); } if (pbc != NULL) { pbc->Release(); } } if ( SUCCEEDED(hr) ) { Animate_Open(GetDlgItem(hDlg, IDC_DOWNLOADANIMATE), IDA_DOWNLOAD); Animate_Play(GetDlgItem(hDlg, IDC_DOWNLOADANIMATE), 0, -1, -1); } else EndDialog(hDlg, FALSE); fRet = 0; break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: Assert( pctlitem->m_pcdlbsc != NULL ); hr = pctlitem->m_pcdlbsc->Abort(); Assert( SUCCEEDED( hr ) ); EndDialog(hDlg, FALSE); break; case DOWNLOAD_PROGRESS: SendMessage(GetDlgItem(hDlg, IDC_DOWNLOADPROGRESS), PBM_SETPOS, lParam, 0); break; case DOWNLOAD_COMPLETE: if (lParam) SendMessage(GetDlgItem(hDlg, IDC_DOWNLOADPROGRESS), PBM_SETPOS, 100, 0); EndDialog(hDlg, lParam); break; } break; case WM_CLOSE: EndDialog(hDlg, FALSE); break; case WM_DESTROY: Assert( pctlitem->m_pcdlbsc != NULL ); pctlitem->m_pcdlbsc->_hdlg = NULL; pctlitem->m_pcdlbsc->Release(); break; default: fRet = FALSE; } return fRet; } BOOL CControlItem::IsGlobalOffline() { DWORD dwState = 0, dwSize = sizeof(DWORD); BOOL fRet = FALSE; if(InternetQueryOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &dwState, &dwSize)) { if(dwState & INTERNET_STATE_DISCONNECTED_BY_USER) fRet = TRUE; } return fRet; }