📄 upgradeatx.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 + -