⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 view.cpp

📁 很好用的ftp源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
            if (EVAL(SUCCEEDED(FtpPidl_GetUserName(m_pff->GetPrivatePidlReference(), szUserName, ARRAYSIZE(szUserName)))))
            {
                *pbstr = TCharSysAllocString((0 != szUserName[0]) ? szUserName : SZ_ANONYMOUS);
                if (*pbstr)
                    hr = S_OK;
            }
        }
    }
    else
        hr = E_INVALIDARG;

    ASSERT_POINTER_MATCHES_HRESULT(*pbstr, hr);
    return hr;
}


/*****************************************************************************\
    FUNCTION: IFtpWebView::get_PasswordLength

    DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::get_PasswordLength(long * plLength)
{
    HRESULT hr = S_FALSE;

    if (EVAL(plLength))
    {
        TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];

        *plLength = 0;
        if (SUCCEEDED(FtpPidl_GetPassword(m_pff->GetPrivatePidlReference(), szPassword, ARRAYSIZE(szPassword), FALSE)))
        {
            *plLength = lstrlen(szPassword);
            hr = S_OK;
        }
    }
    else
        hr = E_INVALIDARG;

    ASSERT_POINTER_MATCHES_HRESULT(*plLength, hr);
    return hr;
}


/*****************************************************************************\
    FUNCTION: IFtpWebView::get_EmailAddress

    DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::get_EmailAddress(BSTR * pbstr)
{
    HRESULT hr = S_OK;

    if (EVAL(pbstr))
    {
        TCHAR szEmailName[MAX_PATH];
        DWORD dwType = REG_SZ;
        DWORD cbSize = sizeof(szEmailName);

        if (ERROR_SUCCESS == SHGetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, &dwType, szEmailName, &cbSize))
            *pbstr = TCharSysAllocString(szEmailName);
        else
        {
            hr = S_FALSE;
            *pbstr = NULL;
        }
    }
    else
        hr = E_INVALIDARG;

    return hr;
}


/*****************************************************************************\
    FUNCTION: IFtpWebView::put_EmailAddress

    DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::put_EmailAddress(BSTR bstr)
{
    HRESULT hr = S_OK;

    if (EVAL(bstr))
    {
        TCHAR szEmailName[MAX_PATH];

        SHUnicodeToTChar(bstr, szEmailName, ARRAYSIZE(szEmailName));
        if (ERROR_SUCCESS != SHSetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, REG_SZ, szEmailName, sizeof(szEmailName)))
            hr = S_FALSE;
    }
    else
        hr = E_INVALIDARG;

    return hr;
}


/*****************************************************************************\
    FUNCTION: IFtpWebView::get_CurrentLoginAnonymous

    DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::get_CurrentLoginAnonymous(VARIANT_BOOL * pfAnonymousLogin)
{
    HRESULT hr = S_OK;

    if (EVAL(pfAnonymousLogin))
    {
        TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH];

        if (EVAL(m_pff) &&
            SUCCEEDED(FtpPidl_GetUserName(m_pff->GetPrivatePidlReference(), szUserName, ARRAYSIZE(szUserName))) &&
            szUserName[0] && (0 != StrCmpI(szUserName, TEXT("anonymous"))))
        {
            *pfAnonymousLogin = VARIANT_FALSE;
        }
        else
            *pfAnonymousLogin = VARIANT_TRUE;
    }
    else
        hr = E_INVALIDARG;

    return hr;
}


/*****************************************************************************\
    FUNCTION: IFtpWebView::LoginAnonymously

    DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::LoginAnonymously(void)
{
    return _LoginWithPassword(NULL, NULL);
}


/*****************************************************************************\
    FUNCTION: IFtpWebView::LoginWithPassword

    DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::LoginWithPassword(BSTR bUserName, BSTR bPassword)
{
    HRESULT hr = S_OK;
    TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH];
    TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];

    SHUnicodeToTChar(bUserName, szUserName, ARRAYSIZE(szUserName));
    SHUnicodeToTChar(bPassword, szPassword, ARRAYSIZE(szPassword));
    return _LoginWithPassword(szUserName, szPassword);
}


/*****************************************************************************\
    FUNCTION: IFtpWebView::LoginWithoutPassword

    DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::LoginWithoutPassword(BSTR bUserName)
{
    HRESULT hr = S_FALSE;
    TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH];
    TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];

    SHUnicodeToTChar(bUserName, szUserName, ARRAYSIZE(szUserName));
    if (SUCCEEDED(FtpPidl_GetPassword(m_pff->GetPrivatePidlReference(), szPassword, ARRAYSIZE(szPassword), TRUE)))
        hr = _LoginWithPassword(szUserName, szPassword);

    return hr;
    
}


HRESULT CFtpView::_LoginWithPassword(LPCTSTR pszUserName, LPCTSTR pszPassword)
{
    HRESULT hr = S_OK;
    LPITEMIDLIST pidlUser;

    hr = PidlReplaceUserPassword(m_pff->GetPrivatePidlReference(), &pidlUser, m_pff->GetItemAllocatorDirect(), pszUserName, pszPassword);
    if (EVAL(SUCCEEDED(hr)))
    {
        LPITEMIDLIST pidlFull = m_pff->CreateFullPublicPidl(pidlUser);
        if (pidlFull)
        {
            hr = IUnknown_PidlNavigate(m_psfv, pidlFull, TRUE);
            ASSERT(SUCCEEDED(hr));
            ILFree(pidlFull);
        }

        ILFree(pidlUser);
    }

    if (FAILED(hr))
        hr = S_FALSE;   // Automation interfaces don't like failure returns.

    return hr;
}


//===========================
// *** IDispatch Interface ***
//===========================

// BUGBUG: Cane we nuke this?

STDMETHODIMP CFtpView::GetTypeInfoCount(UINT * pctinfo)
{ 
    return CImpIDispatch::GetTypeInfoCount(pctinfo); 
}

STDMETHODIMP CFtpView::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo * * pptinfo)
{ 
    return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo); 
}

STDMETHODIMP CFtpView::GetIDsOfNames(REFIID riid, OLECHAR * * rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{ 
    return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); 
}

STDMETHODIMP CFtpView::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{
    return CImpIDispatch::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
}


/*****************************************************************************
 *
 *	CFtpView_Create
 *
 *	Creates a brand new enumerator based on an ftp site.
 *
 *****************************************************************************/
HRESULT CFtpView_Create(CFtpFolder * pff, HWND hwndOwner, REFIID riid, LPVOID * ppv)
{
    HRESULT hr = E_OUTOFMEMORY;
    CFtpView * pfv = new CFtpView(pff, hwndOwner);

    if (EVAL(pfv))
    {
        hr = pfv->QueryInterface(riid, ppv);
        pfv->Release();
    }

    ASSERT_POINTER_MATCHES_HRESULT(*ppv, hr);
    return hr;
}



/****************************************************\
    Constructor
\****************************************************/
CFtpView::CFtpView(CFtpFolder * pff, HWND hwndOwner) : CImpIDispatch(&LIBID_MSIEFTPLib)
{
    DllAddRef();

    // This needs to be allocated in Zero Inited Memory.
    // Assert that all Member Variables are inited to Zero.
    ASSERT(!m_hwndOwner);
    ASSERT(!m_hwndStatusBar);
    ASSERT(!m_pff);
    ASSERT(!m_hgtiWelcome);
    
    m_nThreadID = GetCurrentThreadId();
    if (hwndOwner)
    {
        m_hwndOwner = hwndOwner;
        m_hwndStatusBar = Misc_FindStatusBar(hwndOwner);
        m_psb = CStatusBar_Create(m_hwndStatusBar);
        _InitStatusBar();
    }

    m_rcPrev.top = m_rcPrev.bottom = m_rcPrev.right = m_rcPrev.left = -1;
    IUnknown_Set(&m_pff, pff);

    LEAK_ADDREF(LEAK_CFtpView);
    g_cRef_CFtpView++;  // Needed to determine when to purge cache.
}


/****************************************************\
    Destructor
\****************************************************/
/*****************************************************************************
 *
 *      FtpView_OnRelease (from shell32.IShellView)
 *
 *      When the view is released, clean up various stuff.
 *
 *      BUGBUG -- (Note that there is a race here, because this->hwndOwner
 *      doesn't get zero'd out on the OnWindowDestroy because the shell
 *      doesn't give us a pdvsci...)
 *
 *      We release the psf before triggering the timeout, which is a
 *      signal to the trigger not to do anything.
 *
 *      _UNDOCUMENTED_: This callback and its parameters are not documented.
 *
 *****************************************************************************/
CFtpView::~CFtpView()
{
    IUnknown_Set(&m_pff, NULL);

    // BUGBUG -- should be a cancel, not a trigger
    TriggerDelayedAction(&m_hgtiWelcome);   /* Kick out the old one */

    SetRedirectPidl(NULL);
    if (m_psb)
        delete m_psb;

    if (m_hinstInetCpl)
        FreeLibrary(m_hinstInetCpl);

    DllRelease();
    LEAK_DELREF(LEAK_CFtpView);
    g_cRef_CFtpView--;  // Needed to determine when to purge cache.
}


//===========================
// *** IUnknown Interface ***
//===========================

HRESULT CFtpView::QueryInterface(REFIID riid, void **ppvObj)
{
    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IDispatch))
    {
        *ppvObj = SAFECAST(this, IDispatch *);
    }
    else if (IsEqualIID(riid, IID_IFtpWebView))
    {
        *ppvObj = SAFECAST(this, IFtpWebView *);
    }
    else if (IsEqualIID(riid, IID_CFtpViewPrivThis))
    {
        *ppvObj = (void *)this;
    }
    else
        return CBaseFolderViewCB::QueryInterface(riid, ppvObj);

    AddRef();
    return S_OK;
}


CFtpView * GetCFtpViewFromDefViewSite(IUnknown * punkSite)
{
    CFtpView * pfv = NULL;
    IShellFolderViewCB * psfvcb = NULL;

    // This fails on Browser Only
    IUnknown_QueryService(punkSite, SID_ShellFolderViewCB, IID_IShellFolderViewCB, (LPVOID *) &psfvcb);
    if (psfvcb)
    {
        psfvcb->QueryInterface(IID_CFtpViewPrivThis, (void **) &pfv);
        psfvcb->Release();
    }

    return pfv;
}


CStatusBar * GetCStatusBarFromDefViewSite(IUnknown * punkSite)
{
    CStatusBar * psb = NULL;
    CFtpView * pfv = GetCFtpViewFromDefViewSite(punkSite);

    if (pfv)
    {
        psb = pfv->GetStatusBar();
        pfv->Release();
    }

    return psb;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -