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

📄 upgradeatx.h

📁 本人买的<<VC++项目开发实例>>源代码配套光盘.
💻 H
字号:
// UpgradeAtx.h : Declaration of the CUpgradeAtx

#ifndef __UPGRADEATX_H_
#define __UPGRADEATX_H_

#include "resource.h"       // main symbols
#include <atlctl.h>


//CoClass,实现IUpgradeAtx接口。
//##ModelId=3E5F16D9023E
class ATL_NO_VTABLE CUpgradeAtx : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public IDispatchImpl<IUpgradeAtx, &IID_IUpgradeAtx, &LIBID_UPGRADEATVLib>,
	public CComControl<CUpgradeAtx>,
	public IPersistStreamInitImpl<CUpgradeAtx>,
	public IOleControlImpl<CUpgradeAtx>,
	public IOleObjectImpl<CUpgradeAtx>,
	public IOleInPlaceActiveObjectImpl<CUpgradeAtx>,
	public IViewObjectExImpl<CUpgradeAtx>,
	public IOleInPlaceObjectWindowlessImpl<CUpgradeAtx>,
	public IPersistStorageImpl<CUpgradeAtx>,
	public ISpecifyPropertyPagesImpl<CUpgradeAtx>,
	public IQuickActivateImpl<CUpgradeAtx>,
	public IDataObjectImpl<CUpgradeAtx>,
	public IProvideClassInfo2Impl<&CLSID_UpgradeAtx, NULL, &LIBID_UPGRADEATVLib>,
	public CComCoClass<CUpgradeAtx, &CLSID_UpgradeAtx>
{
public:
	//##ModelId=3E623B2003DE
	HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
	{
		// Get the container's window.
		_ASSERT (m_spClientSite);
		LPOLEINPLACESITE pInPlaceSite = NULL;
		HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite,
													(void       **)&pInPlaceSite);
		_ASSERT (SUCCEEDED (hr) && pInPlaceSite);
		HWND hParent = NULL;
		hr = pInPlaceSite->GetWindow (&hParent);
		_ASSERT (SUCCEEDED (hr) && hParent);
		pInPlaceSite->Release ();
		// Set container window as our parent window
		SetParent (hParent);
		return CComControlBase::InPlaceActivate(iVerb, prcPosRect);

	}

	//##ModelId=3E623B21001E
	virtual HRESULT STDMETHODCALLTYPE SetClientSite(IOleClientSite *pClientSite);
	//构造函数。
	//##ModelId=3E5F16D9039D
	CUpgradeAtx()
		: m_strRemoteFile("/setup.exe")
		, m_strServerName("localhost")

		, m_uFullScale(0)
		, m_uCurrentScale(0)
	{
		//取得Temp路径
		int iLen=GetEnvironmentVariable("TEMP",NULL,0);
        CString strVar('\x0', iLen + 1);
        GetEnvironmentVariable("TEMP", strVar.GetBuffer(iLen + 1),iLen + 1);
		//注意,如果不调用下面的ReleaseBuffer,那么strVar + "\\setup.exe"
		//就不会被真正加到这个字符串上。
		strVar.ReleaseBuffer(-1);
		m_strLocalFile = strVar + "\\setup.exe";
		//设置ActiveX为有窗口的控件。
		m_bWindowOnly = 1;
		m_bWndLess = 0;
	}

DECLARE_REGISTRY_RESOURCEID(IDR_UPGRADEATX)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CUpgradeAtx)
	COM_INTERFACE_ENTRY(IUpgradeAtx)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(IViewObjectEx)
	COM_INTERFACE_ENTRY(IViewObject2)
	COM_INTERFACE_ENTRY(IViewObject)
	COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
	COM_INTERFACE_ENTRY(IOleInPlaceObject)
	COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
	COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
	COM_INTERFACE_ENTRY(IOleControl)
	COM_INTERFACE_ENTRY(IOleObject)
	COM_INTERFACE_ENTRY(IPersistStreamInit)
	COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
	COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
	COM_INTERFACE_ENTRY(IQuickActivate)
	COM_INTERFACE_ENTRY(IPersistStorage)
	COM_INTERFACE_ENTRY(IDataObject)
	COM_INTERFACE_ENTRY(IProvideClassInfo)
	COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()

BEGIN_PROP_MAP(CUpgradeAtx)
	PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
	PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
	// Example entries
	// PROP_ENTRY("Property Description", dispid, clsid)
	// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

BEGIN_MSG_MAP(CUpgradeAtx)
	CHAIN_MSG_MAP(CComControl<CUpgradeAtx>)
	DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes:
//  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
//  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
//  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);



// IViewObjectEx
	DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IUpgradeAtx
public:
	//执行安装程序。
	//它是在下载成功以后执行的。
	//##ModelId=3E623B210032
	STDMETHOD(DoSetup)();
	//判断应用程序是否已经安装在客户端。
	//##ModelId=3E5F16D9039E
	STDMETHOD(IsAppExisting)(/*[out, retval]*/ VARIANT_BOOL *ret);
	//从FTP服务器上下载安装文件。
	//##ModelId=3E5F16D903A8
	STDMETHOD(Download)(/*[out, retval]*/ VARIANT_BOOL *ret);

	//显示进度条
	//##ModelId=3E5F16D903B2
	HRESULT OnDraw(ATL_DRAWINFO& di)
	{
		CRect rc = *(RECT*)di.prcBounds;
		Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);

		
		//画进度条
		CBrush brBackground(RGB(0, 0, 0xFF));
		CRect rect = CRect(0, 0, 0, 0);
		if (m_uFullScale > 0)
		{
			rect.left = 0;
			rect.top = 0;
			rect.right = (int)(rc.Width() * (m_uCurrentScale * 1.0 / m_uFullScale));
			rect.bottom = rc.Height();
			TRACE("%d, %d, %d, %d\n", rect.left, rect.top, rect.right, rect.bottom);
			FillRect(di.hdcDraw, &rect, brBackground);

			//写刻度
			SetBkMode(di.hdcDraw, TRANSPARENT);					//设置为透明背景
			CString strScale;
			strScale.Format("%u%%", 100 * m_uCurrentScale / m_uFullScale);
			DrawText(di.hdcDraw, strScale, strScale.GetLength(), &rc, DT_CENTER | DT_VCENTER);
		}
		TRACE("OnDraw\n");
		return S_OK;
	}
private:
	//进度条控制变量。当前的进度,也就是已经下载的字节数。
	//##ModelId=3E623B210046
	UINT m_uCurrentScale;
	//进度条控制。也就是要下载的文件的长度。
	//##ModelId=3E623B22012D
	UINT m_uFullScale;
	//推进进度条的显示,分发WM_PAINT消息。
	//##ModelId=3E623B220141
	void Proceed(UINT scale);
	//从服务器上下载FTP安装文件后保存到本地时使用的文件名。
	//##ModelId=3E5F16D903BB
	CString m_strLocalFile;
	//要从FTP服务器上下载的文件。
	//##ModelId=3E5F16DA0036
	const CString m_strRemoteFile;
	//FTP服务器名称。可以使用IP地址,也可以是服务器名称。
	//##ModelId=3E5F16DA0040
	const CString m_strServerName;
	//取得要下载的文件的长度,以字节为单位
	//##ModelId=3E5F16DA004A
	DWORD GetFileLength();
	//##ModelId=3E5F16DA0054
	bool GetParameter();
};

#endif //__UPGRADEATX_H_

⌨️ 快捷键说明

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