514 lines
21 KiB
C
514 lines
21 KiB
C
|
#ifndef __CLEANOC_API__
|
||
|
#define __CLEANOC_API__
|
||
|
|
||
|
// Flags used in GetControlInfo()
|
||
|
#define GCI_NAME 1
|
||
|
#define GCI_FILE 2
|
||
|
#define GCI_CLSID 3
|
||
|
#define GCI_TYPELIBID 4
|
||
|
#define GCI_TOTALSIZE 5
|
||
|
#define GCI_SIZESAVED 6
|
||
|
#define GCI_TOTALFILES 7
|
||
|
#define GCI_CODEBASE 8
|
||
|
#define GCI_ISDISTUNIT 9
|
||
|
#define GCI_DIST_UNIT_VERSION 10
|
||
|
#define GCI_STATUS 11
|
||
|
#define GCI_HAS_ACTIVEX 12
|
||
|
#define GCI_HAS_JAVA 13
|
||
|
|
||
|
// control status flags
|
||
|
#define STATUS_CTRL_UNKNOWN 0 // Errors prevent determining the actual control state
|
||
|
#define STATUS_CTRL_INSTALLED 1 // Control is properly installed and ready for use
|
||
|
#define STATUS_CTRL_SHARED 2 // One or more components are shared by more than one control
|
||
|
#define STATUS_CTRL_DAMAGED 3 // The control file or some part of the installation is damaged or missing
|
||
|
#define STATUS_CTRL_UNPLUGGED 4 // The control has been re-registered in another location, the cache's
|
||
|
// instance of the control is no longer being used.
|
||
|
|
||
|
// RemoveExpiredControls flags
|
||
|
#define REC_SILENT 1 // If set, controls whose deletion would require confirmation are not removed.
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// FindFirstControl
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Initiate a search on the registry for an installed ActiveX control.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - ERROR_SUCCESS if a control is found and search has been successfully
|
||
|
// initiated.
|
||
|
// - ERROR_NO_MORE_ITEMS if no control is found.
|
||
|
// - If an error has occurred, the return value is a error code defined in
|
||
|
// winerror.h
|
||
|
//
|
||
|
// Parameters:
|
||
|
// hFindHandle -- a handle needed for resuming the search. Caller must
|
||
|
// pass this handle to FindNextControl to retrieve the
|
||
|
// the next installed ActiveX control.
|
||
|
// hControlHandle -- handle to a control's data. Caller must pass this
|
||
|
// handle into GetControlInfo to retrieve information
|
||
|
// about the control. Call ReleaseControlHandle on the
|
||
|
// handle when done.
|
||
|
// lpCachePath -- points to a string buffer that has the path where
|
||
|
// all controls to be retrieved are located. If it
|
||
|
// is NULL, the internet cache path will be read
|
||
|
// from the registry. If a path is to be supplied,
|
||
|
// the path must be a full pathname without any ~'s
|
||
|
// in order for the enumeration to work correctly.
|
||
|
//
|
||
|
#define axcFINDFIRSTCONTROL "FindFirstControl"
|
||
|
|
||
|
LONG WINAPI FindFirstControl(
|
||
|
HANDLE& hFindHandle,
|
||
|
HANDLE& hControlHandle,
|
||
|
LPCTSTR lpszCachePath = NULL
|
||
|
);
|
||
|
|
||
|
typedef LONG (WINAPI *FINDFIRSTCONTROL)(
|
||
|
HANDLE& hFindHandle,
|
||
|
HANDLE& hControlHandle,
|
||
|
LPCTSTR lpszCachePath = NULL
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// FindNextControl
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Resume a previously started search for installed ActiveX controls. The
|
||
|
// search must have been initiated by a call to FirstFirstControl.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - ERROR_SUCCESS if a control is found and search has been successfully
|
||
|
// initiated.
|
||
|
// - ERROR_NO_MORE_ITEMS if no control is found.
|
||
|
// - If an error has occurred, the return value is a error code defined in
|
||
|
// winerror.h. In this situation, the caller can choose to continue
|
||
|
// the search with another call to FindNextControl, or simply abort.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// hFindHandle -- a handle received from a call to FindFirstControl.
|
||
|
// Pass this handle to subsequent calls to
|
||
|
// FindNextControl to retrieve controls one at a time.
|
||
|
// hControlHandle -- handle to a control's data. Caller must pass this
|
||
|
// handle into GetControlInfo to retrieve information
|
||
|
// about the control. Call ReleaseControlHandle on the
|
||
|
// handle when done.
|
||
|
//
|
||
|
#define axcFINDNEXTCONTROL "FindNextControl"
|
||
|
|
||
|
LONG WINAPI FindNextControl(
|
||
|
HANDLE& hFindHandle,
|
||
|
HANDLE& hControlHandle
|
||
|
);
|
||
|
|
||
|
typedef LONG (WINAPI *FINDNEXTCONTROL)(
|
||
|
HANDLE& hFindHandle,
|
||
|
HANDLE& hControlHandle
|
||
|
);
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// FindControlClose
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Called when search is over. Missing a call to this function after a
|
||
|
// search might contribute memory leak. This function can be called
|
||
|
// regardless of what FindFirstControl and/or FindNextControl return.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// hFindHandle -- a handle obtained from calls to FindFirstControl and
|
||
|
// FindNextControl in the current search.
|
||
|
//
|
||
|
#define axcFINDCONTROLCLOSE "FindControlClose"
|
||
|
|
||
|
void WINAPI FindControlClose(
|
||
|
HANDLE hFindHandle
|
||
|
);
|
||
|
|
||
|
typedef void (WINAPI *FINDCONTROLCLOSE)(
|
||
|
HANDLE hFindHandle
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// ReleaseControlHandle
|
||
|
//
|
||
|
// Purpose:
|
||
|
// When a handle of a control is retrieved via FindFirstControl or
|
||
|
// FindNextControl, the caller is responsible to release that handle
|
||
|
// by call this function.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// hControlHandle -- a handle to a control obtained from FindFirstControl
|
||
|
// or FindNextControl.
|
||
|
//
|
||
|
#define axcRELEASECONTROLHANDLE "ReleaseControlHandle"
|
||
|
|
||
|
void WINAPI ReleaseControlHandle(
|
||
|
HANDLE hControlHandle
|
||
|
);
|
||
|
|
||
|
typedef void (WINAPI *RELEASECONTROLHANDLE)(
|
||
|
HANDLE hControlHandle
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// GetControlInfo
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Once a handle to a control is obtained via FindFirstControl or
|
||
|
// FindNextControl, the caller may retrieve information about the control
|
||
|
// by call this function with a flag (nFlag) indicating what info to
|
||
|
// retrieve. The supported flags are:
|
||
|
// GCI_NAME -- friendly name of control
|
||
|
// GCI_FILE -- main full path & file name of control
|
||
|
// GCI_CLSID -- clsid of control, in a NULL-terminated string
|
||
|
// GCI_TYPELIBID -- typelib guid of control, in a NULL-terminated string
|
||
|
// GCI_TOTALSIZE -- total size in bytes of all control's dependent files
|
||
|
// GCI_SIZESAVED -- total size in bytes restored if control is removed
|
||
|
// It can be different from GCI_TOTALSIZE since some
|
||
|
// of the control's dependent files might be shared dlls
|
||
|
// GCI_TOTALFILES -- total number of control dependent files, including
|
||
|
// shared dlls if there are any
|
||
|
// GCI_STATUS -- the controls status value from STATUS_CTRL_* <above>
|
||
|
// GCI_HAS_ACTIVEX -- non-zero if control includes ActiveX contols(s)
|
||
|
// GCI_HAS_JAVA -- non-zero if control includes Java packages
|
||
|
//
|
||
|
// Return Value:
|
||
|
// TRUE if succeeded, FALSE otherwise.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// hControlHandle -- handle to a control for which information is to be
|
||
|
// retrieved.
|
||
|
// nFlag -- indicate which information to retrieve. Please refer
|
||
|
// to Purpose section above for a list of supported
|
||
|
// flags. nFlag can only equal to one of them so do
|
||
|
// not pass in multiple flags OR'ed together.
|
||
|
// lpdwData -- address of a buffer for storing a numerical value.
|
||
|
// (ie. GCI_TOTALSIZE, GCI_SIZESAVED & GCI_TOTALFILES)
|
||
|
// This parameter is ignored for other flags.
|
||
|
// lpszData -- address of a buffer for storing a NULL-terminated
|
||
|
// string value (ie. GCI_NAME, GCI_FILE, GCI_CLSID &
|
||
|
// GCI_TYPELIBID) This paramter is ignored if other
|
||
|
// flags are specified.
|
||
|
// nBufLen -- length of string buffer pointed to by lpszData.
|
||
|
// This parameter is ignored if a numerical value is
|
||
|
// being retrieved.
|
||
|
//
|
||
|
#define axcGETCONTROLINFO "GetControlInfo"
|
||
|
|
||
|
BOOL WINAPI GetControlInfo(
|
||
|
HANDLE hControlHandle,
|
||
|
UINT nFlag,
|
||
|
LPDWORD lpdwData,
|
||
|
LPTSTR lpszBuf,
|
||
|
int nBufLen
|
||
|
);
|
||
|
|
||
|
typedef BOOL (WINAPI *GETCONTROLINFO)(
|
||
|
HANDLE hControlHandle,
|
||
|
UINT nFlag,
|
||
|
LPDWORD lpdwData,
|
||
|
LPTSTR lpszBuf,
|
||
|
int nBufLen
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// GetControlDependentFile
|
||
|
//
|
||
|
// Purpose:
|
||
|
// A given control might depend on other files. For instance, FOO.OCX
|
||
|
// might need FOO.INF and MFCXX.DLL in order to work. This function
|
||
|
// retrieves one file at a time from a list of files depended upon by a
|
||
|
// given ActiveX control. The list of files is NOT sorted.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - ERROR_SUCCESS if a file is found at position iFile in the list.
|
||
|
// - ERROR_NO_MORE_FILES if no file is found at position iFile in the list.
|
||
|
// - If an error has occurred, the return value is a error code defined in
|
||
|
// winerror.h.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// iFile -- a zero-based index indicating which file in the list
|
||
|
// to retrieve.
|
||
|
// hControlHandle -- handle to a control obtained via FindFirstControl
|
||
|
// or FindNextControl.
|
||
|
// lpszFile -- points to a buffer used to store the retrieved name.
|
||
|
// lpszSize -- points to a DWORD variable that is to store the size
|
||
|
// in bytes of the file retrieved. If it is 0, the file
|
||
|
// does not exist.
|
||
|
// bToUpper -- TRUE if the filename returned is to be converted to
|
||
|
// uppercase. No conversion takes place if FALSE
|
||
|
//
|
||
|
#define axcGETCONTROLDEPENDENTFILE "GetControlDependentFile"
|
||
|
|
||
|
LONG WINAPI GetControlDependentFile(
|
||
|
int iFile,
|
||
|
HANDLE hControlHandle,
|
||
|
LPTSTR lpszFile,
|
||
|
LPDWORD lpdwSize,
|
||
|
BOOL bToUpper = FALSE
|
||
|
);
|
||
|
|
||
|
typedef LONG (WINAPI *GETCONTROLDEPENDENTFILE)(
|
||
|
int iFile,
|
||
|
HANDLE hControlHandle,
|
||
|
LPTSTR lpszFile,
|
||
|
LPDWORD lpdwSize,
|
||
|
BOOL bToUpper = FALSE
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// IsModuleRemovable
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Checks whether a file can be removed by looking into the registry.
|
||
|
// This function is called "IsModuleRemovable" instead of
|
||
|
// "IsFileRemovable" because this routine does not check the actual file
|
||
|
// for its status. For instance, a file can be deemed removable even if
|
||
|
// is being exclusively opened by someone. This routine only tells from
|
||
|
// the registry's point of view if a file can be safely removed or not.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - FALSE if there is any indication that the given file is being shared
|
||
|
// by other applications.
|
||
|
// - TRUE otherwise.
|
||
|
//
|
||
|
// Parameter:
|
||
|
// lpszFile -- points to a buffer that has the name (with full path) of
|
||
|
// the file whose removal status is to be verified.
|
||
|
//
|
||
|
#define axcISMODULEREMOVABLE "IsModuleRemovable"
|
||
|
|
||
|
BOOL WINAPI IsModuleRemovable(
|
||
|
LPCTSTR lpszFile
|
||
|
);
|
||
|
|
||
|
typedef BOOL (WINAPI *ISMODULEREMOVABLE)(
|
||
|
LPCTSTR lpszFile
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// RemoveControlByHandle
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Remove a control from registry as well as all the files that the control
|
||
|
// depends on.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - S_OK if control has been successfully uninstalled.
|
||
|
// - S_FALSE if minor error has occurred, but not serious enough to
|
||
|
// abort the uninstallation. Control has been uninstalled when the
|
||
|
// call returns.
|
||
|
// - An error code defined in winerror.h if an serious error has occurred
|
||
|
// and uninstallation has been aborted. The state of the control
|
||
|
// is not gaurenteed.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// lpControlData -- points to an instance of CONTROL_DATA representing the
|
||
|
// control to be removed. The struct must have been
|
||
|
// initialized by a call to FindFirstControl or
|
||
|
// FindNextControl. Be sure to call ReleaseControlData
|
||
|
// on this struct after successful removal, for the data
|
||
|
// in this struct is no longer useful.
|
||
|
// bForceRemove -- If this flag is FALSE, the removal routine will check
|
||
|
// if the control is safe for removal before removing it.
|
||
|
// If the flag is TRUE, the control will be removed
|
||
|
// regardless of its removal status (except for Shared
|
||
|
// Violation). The flag only applies to the control file
|
||
|
// itself. Other files upon which the control depends are
|
||
|
// removed only if they are deemed as safe for removal.
|
||
|
//
|
||
|
#define axcREMOVECONTROLBYHANDLE "RemoveControlByHandle"
|
||
|
|
||
|
HRESULT WINAPI RemoveControlByHandle(
|
||
|
HANDLE hControlHandle,
|
||
|
BOOL bForceRemove = FALSE
|
||
|
);
|
||
|
|
||
|
typedef HRESULT (WINAPI *REMOVECONTROLBYHANDLE)(
|
||
|
HANDLE hControlHandle,
|
||
|
BOOL bForceRemove = FALSE
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// RemoveControlByName
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Remove a control from registry as well as all the files that the control
|
||
|
// depends on. It is an overloaded version.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - S_OK if control has been successfully uninstalled.
|
||
|
// - S_FALSE if minor error has occurred, but not serious enough to
|
||
|
// abort the uninstallation. Control has been uninstalled when the
|
||
|
// call returns.
|
||
|
// - An error code defined in winerror.h if an serious error has occurred
|
||
|
// and uninstallation has been aborted. The state of the control
|
||
|
// is not gaurenteed.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// lpszFile -- Address of a null-terminated string which is the main
|
||
|
// file for the control (ie "FOO.OCX" for FOO control).
|
||
|
// lpszCLSID -- Address of a null-terminated string which is the CLSID
|
||
|
// of the control.
|
||
|
// lpszTypeLibID -- Address of a null-terminated string which is the TypeLib
|
||
|
// clsid of the control.
|
||
|
// bForceRemove -- If this flag is FALSE, the removal routine will check
|
||
|
// if the control is safe for removal before removing it.
|
||
|
// If the flag is TRUE, the control will be removed
|
||
|
// regardless of its removal status (except for Shared
|
||
|
// Violation). The flag only applies to the control file
|
||
|
// itself. Other files upon which the control depends are
|
||
|
// removed only if they are deemed as safe for removal.
|
||
|
// dwIsDistUnit -- boolean value to tell if this is really a dist unit
|
||
|
//
|
||
|
#define axcREMOVECONTROLBYNAME "RemoveControlByName"
|
||
|
|
||
|
HRESULT WINAPI RemoveControlByName(
|
||
|
LPCTSTR lpszFile,
|
||
|
LPCTSTR lpszCLSID,
|
||
|
LPCTSTR lpszTypeLibID,
|
||
|
BOOL bForceRemove = FALSE,
|
||
|
DWORD dwIsDistUnit = FALSE
|
||
|
);
|
||
|
|
||
|
typedef HRESULT (WINAPI *REMOVECONTROLBYNAME)(
|
||
|
LPCTSTR lpszFile,
|
||
|
LPCTSTR lpszCLSID,
|
||
|
LPCTSTR lpszTypeLibID,
|
||
|
BOOL bForceRemove = FALSE,
|
||
|
DWORD dwIsDistUnit = FALSE
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// type PFNDOBEFOREREMOVAL, used for function SweepControlsByLastAccessDate
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Define callback function to be called right before removing a control
|
||
|
//
|
||
|
// Return Values:
|
||
|
// If a success code (S_XXX) is returned, the control will be removed.
|
||
|
// If a fail code (E_XXX) is returned, the control will be skipped.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// HANDLE -- handle to the control to be removed. One can get information
|
||
|
// about the control using the GetControlInfo function. Do NOT
|
||
|
// call ReleaseControlHandle on the handle.
|
||
|
// UINT -- number of remaining controls including this one.
|
||
|
//
|
||
|
typedef HRESULT (CALLBACK *PFNDOBEFOREREMOVAL)(HANDLE, UINT);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// type PFNDOAFTERREMOVAL, used for function SweepControlsByLastAccessDate
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Define callback function to be called right after removing a control
|
||
|
//
|
||
|
// Return Values:
|
||
|
// If a success code (S_XXX) is returned, the removal operation proceeds.
|
||
|
// If a fail code (E_XXX) is returned, the removal operation is aborted.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// HRESULT -- result of removing the control. The handle to this control
|
||
|
// was passed to the callback of type PFNDOBEFOREREMOVAL before
|
||
|
// the control was removed. The possible values for this
|
||
|
// HRESULT parameter are:
|
||
|
// - S_OK (succeeded)
|
||
|
// - S_FALSE (control had been removed with possibly some very
|
||
|
// minor errors)
|
||
|
// - E_ACCESSDENIED (control not safe for removal)
|
||
|
// - STG_E_SHAREVIOLATION (control being used by others)
|
||
|
// - Other errors returned by registry functions
|
||
|
// It is up to the implementator of this function to decide
|
||
|
// what to do given the result of removing the last control.
|
||
|
// UINT -- number of remaining controls, NOT including the one just
|
||
|
// removed.
|
||
|
//
|
||
|
typedef HRESULT (CALLBACK *PFNDOAFTERREMOVAL)(HRESULT, UINT);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// SweepControlsByLastAccessDate
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Remove all controls whose last access date is before and on a given
|
||
|
// date.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - S_OK if succeeded and at least one control was removed.
|
||
|
// - S_FALSE if succeeded but no controls have been removed.
|
||
|
// - E_XXX defined in winerror.h if an error has occurred.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// pLastAccessTime -- specify a last access date. All controls accessed
|
||
|
// before and on this date are to be removed. Note
|
||
|
// that all fields except wYear, wMonth and wDay are
|
||
|
// ignored. If NULL, all control will be removed.
|
||
|
// pfnDoBefore -- callback function called just before a control is
|
||
|
// removed. Please read the description for type
|
||
|
// PFNDOBEFOREREMOVAL for details. If NULL, nothing
|
||
|
// is to be done prior to removing a control.
|
||
|
// pfnDoAfter -- callback function called right after a control is
|
||
|
// removed. Please read the description for type
|
||
|
// PFNDOAFTERREMOVAL for details. If NULL, nothing
|
||
|
// is to be done after a control is removed.
|
||
|
// dwSizeLimit -- controls will be removed only if the total size
|
||
|
// (in bytes) of all controls exceeds the size
|
||
|
// specified by this paramter. This parameter is
|
||
|
// ignored if 0 is specified.
|
||
|
//
|
||
|
#define axcSWEEPCONTROLSBYLASTACCESSDATE "SweepControlsByLastAccessDate"
|
||
|
|
||
|
HRESULT WINAPI SweepControlsByLastAccessDate(
|
||
|
SYSTEMTIME *pLastAccessTime = NULL,
|
||
|
PFNDOBEFOREREMOVAL pfnDoBefore = NULL,
|
||
|
PFNDOAFTERREMOVAL pfnDoAfter = NULL,
|
||
|
DWORD dwSizeLimit = 0
|
||
|
);
|
||
|
|
||
|
typedef HRESULT (WINAPI *SWEEPCONTROLSBYLASTACCESSDATE)(
|
||
|
SYSTEMTIME *pLastAccessTime = NULL,
|
||
|
PFNDOBEFOREREMOVAL pfnDoBefore = NULL,
|
||
|
PFNDOAFTERREMOVAL pfnDoAfter = NULL,
|
||
|
DWORD dwSizeLimit = 0
|
||
|
);
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// RemoveExpiredControls
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Similar to IEmptyVolumeCache. Removes all controls with a last
|
||
|
// access date in the distant past and all controls flagged for more
|
||
|
// rapid auto-expire.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// - S_OK if succeeded and at least one control was removed.
|
||
|
// - S_FALSE if succeeded but no controls have been removed.
|
||
|
// - E_XXX defined in winerror.h if an error has occurred.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// dwFlags -- Currently, only REC_SILENT is defined.
|
||
|
// dwReserved -- Must be 0.
|
||
|
//
|
||
|
#define axcREMOVEEXPIREDCONTROLS "RemoveExpiredControls"
|
||
|
|
||
|
HRESULT WINAPI RemoveExpiredControls(DWORD dwFlags, DWORD dwReserved);
|
||
|
|
||
|
typedef HRESULT (WINAPI *REMOVEEXPIREDCONTROLS)(DWORD dwFlags, DWORD dwReserved);
|
||
|
|
||
|
#endif
|