windows-nt/Source/XPSP1/NT/sdktools/appparse/appparseweb/appparsewrapper.h
2020-09-26 16:20:57 +08:00

313 lines
8.5 KiB
C++

// AppParse.h : Declaration of the CAppParse
#ifndef __APPPARSE_H_
#define __APPPARSE_H_
#include "resource.h" // main symbols
#include <atlctl.h>
#include <windows.h>
#include <icrsint.h>
#include <oledb.h>
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
void APError(char* szMessage, HRESULT hr);
/////////////////////////////////////////////////////////////////////////////
// CAppParse
class ATL_NO_VTABLE CAppParse :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IAppParse, &IID_IAppParse, &LIBID_APPPARSEWEBLib>,
public CComControl<CAppParse>,
public IPersistStreamInitImpl<CAppParse>,
public IOleControlImpl<CAppParse>,
public IOleObjectImpl<CAppParse>,
public IOleInPlaceActiveObjectImpl<CAppParse>,
public IViewObjectExImpl<CAppParse>,
public IOleInPlaceObjectWindowlessImpl<CAppParse>,
public IPersistStorageImpl<CAppParse>,
public ISpecifyPropertyPagesImpl<CAppParse>,
public IQuickActivateImpl<CAppParse>,
public IDataObjectImpl<CAppParse>,
public IProvideClassInfo2Impl<&CLSID_AppParse, NULL, &LIBID_APPPARSEWEBLib>,
public CComCoClass<CAppParse, &CLSID_AppParse>,
public IObjectSafetyImpl<CAppParse, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
public IObjectSafetyImpl<CAppParse, INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
private:
char* m_szConnect;
char* m_szPath;
long m_ID;
HANDLE m_hEvent;
public:
CAppParse()
{
m_hEvent = 0;
m_szConnect = 0;
m_szPath = 0;
m_ID = -1;
m_hEvent = CreateEvent(0, TRUE, FALSE, 0);
if(!m_hEvent)
APError("Unable to create kernel object", E_FAIL);
}
~CAppParse()
{
if(m_hEvent)
CloseHandle(m_hEvent);
if(m_szPath)
delete m_szPath;
}
DECLARE_REGISTRY_RESOURCEID(IDR_APPPARSE)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CAppParse)
COM_INTERFACE_ENTRY(IAppParse)
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(CAppParse)
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(CAppParse)
CHAIN_MSG_MAP(CComControl<CAppParse>)
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)
// IAppParse
public:
STDMETHOD(QueryDB)(long PtolemyID, BSTR bstrFunction);
STDMETHOD(get_ConnectionString)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_ConnectionString)(/*[in]*/ BSTR newVal);
STDMETHOD(get_PtolemyID)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_PtolemyID)(/*[in]*/ long newVal);
STDMETHOD(get_path)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_path)(/*[in]*/ BSTR newVal);
STDMETHOD(Browse)();
STDMETHOD(Parse)();
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("ATL 3.0 : AppParse");
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
return S_OK;
}
};
// All information associated with an EXE or DLL.
struct SImageFileInfo
{
int DateStatus;
double Date;
int SizeStatus;
int Size;
int BinFileVersionStatus;
CHAR BinFileVersion[50];
int BinProductVersionStatus;
CHAR BinProductVersion[50];
int CheckSumStatus;
ULONG CheckSum;
int CompanyNameStatus;
CHAR CompanyName[255];
int ProductVersionStatus;
CHAR ProductVersion[50];
int ProductNameStatus;
CHAR ProductName[255];
int FileDescStatus;
CHAR FileDesc[255];
};
// Record bindings, eases associating database records with C++ structures.
// A Project record, a single entry in the "Projects" table
struct SProjectRecord : public CADORecordBinding
{
BEGIN_ADO_BINDING(SProjectRecord)
// All fields optional
ADO_NUMERIC_ENTRY2(1, adInteger, PtolemyID, 5, 0, TRUE)
ADO_VARIABLE_LENGTH_ENTRY4(2, adVarChar, Name, 255, TRUE)
END_ADO_BINDING()
// A unique identifier for this project.
ULONG PtolemyID;
// A user-friendly name for the project
CHAR Name[255];
};
// A Module (EXE or DLL) record
struct SModuleRecord : public CADORecordBinding
{
BEGIN_ADO_BINDING(SModuleRecord)
// Query the autonumber DllID, don't change
ADO_NUMERIC_ENTRY2(1, adInteger, ModuleID, 5, 0, FALSE)
// At least one of these fields must be present
ADO_NUMERIC_ENTRY(2, adInteger, ParentID, 5, 0, PtolemyIDStatus, TRUE)
ADO_NUMERIC_ENTRY(3, adInteger, ParentID, 5, 0, ParentIDStatus, TRUE)
// Required fields
ADO_VARIABLE_LENGTH_ENTRY4(4, adVarChar, Name, 255, TRUE)
ADO_FIXED_LENGTH_ENTRY2(5, adBoolean, SysMod, TRUE)
// Optional fields
ADO_FIXED_LENGTH_ENTRY(6, adDate, info.Date, info.DateStatus, TRUE)
ADO_NUMERIC_ENTRY(7, adInteger, info.Size, 5, 0, info.SizeStatus, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2(8, adVarChar, info.BinFileVersion, 50,
info.BinFileVersionStatus, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2(9, adVarChar, info.BinProductVersion, 50,
info.BinProductVersionStatus, TRUE)
ADO_NUMERIC_ENTRY(10, adInteger, info.CheckSum, 5, 0, info.CheckSumStatus, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2(11, adVarChar, info.CompanyName, 255, info.CompanyNameStatus, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2(12, adVarChar, info.ProductVersion, 50, info.ProductVersionStatus, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2(13, adVarChar, info.ProductName, 255, info.ProductNameStatus, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2(14, adVarChar, info.FileDesc, 255, info.FileDescStatus, TRUE)
END_ADO_BINDING()
public:
// Unique ID for this entry (autonumber, done by DB)
ULONG ModuleID;
// Whether this module belongs to a project or
// is a child of another module
int PtolemyIDStatus;
int ParentIDStatus;
// Parent's ID (either Ptolemy or Module)
ULONG ParentID;
// Filename of this module.
CHAR Name[255];
// File info
SImageFileInfo info;
// Whether or not this is a "system" module (like kernel32, user, gdi, advapi, etc.)
DWORD SysMod;
};
// A Function Record
struct SFunctionRecord : public CADORecordBinding
{
BEGIN_ADO_BINDING(SFunctionRecord)
// Required fields
ADO_NUMERIC_ENTRY2(1, adInteger, FunctionID, 5, 0, FALSE)
ADO_NUMERIC_ENTRY2(2, adInteger, ModuleID, 5, 0, TRUE)
ADO_VARIABLE_LENGTH_ENTRY4(3, adVarChar, Name, 255, TRUE)
ADO_FIXED_LENGTH_ENTRY2(8, adBoolean, Delayed, TRUE)
// Optional fields
ADO_NUMERIC_ENTRY(4, adInteger, Address, 5,0,AddressStatus, TRUE)
ADO_NUMERIC_ENTRY(5, adInteger, Ordinal, 5, 0, OrdinalStatus, TRUE)
ADO_NUMERIC_ENTRY(6, adInteger, Hint, 5, 0, HintStatus, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2(7, adVarChar, ForwardName, 255,
ForwardNameStatus, TRUE)
END_ADO_BINDING()
public:
// Unique ID for this function (autonumber, given by the DB)
ULONG FunctionID;
// Parent module
ULONG ModuleID;
// Imported function name
CHAR Name[255];
// Address, if bound
int AddressStatus;
ULONG Address;
// Ordinal, if ordinal import
int OrdinalStatus;
ULONG Ordinal;
// Hint, if name import
int HintStatus;
ULONG Hint;
// Forwarded name (e.g., HeapAlloc->RtlAllocateHeap)
int ForwardNameStatus;
CHAR ForwardName[255];
// Whether this is a delayed import or not.
DWORD Delayed;
};
// "Safely" release a COM object.
template<class T>
inline void SafeRelease(T& obj)
{
if(obj)
{
obj->Release();
obj = 0;
}
}
#endif //__APPPARSE_H_