786 lines
23 KiB
Plaintext
786 lines
23 KiB
Plaintext
|
||
/*++
|
||
|
||
UMI_V6.IDL
|
||
|
||
Universal Management Interfaces for Whistler WMI/DS Providers
|
||
|
||
v1.01 raymcc 13-Jan-00 Second draft in preparation for meeting with ADSI team
|
||
v1.02 raymcc 17-Jan-00 DS long meeting (Sanjes, alanbos, DS team)
|
||
v1.03 raymcc 28-Jan-00 Updates after 'type system' meeting
|
||
v1.04 raymcc 02-Feb-00 Compilable, slight reorg of COM inheritance
|
||
v1.05 raymcc 03-Feb-00 Type system
|
||
v1.06 raymcc 11-Feb-00 Type system cleanup after meeting with ADSI team
|
||
v1.07 raymcc 15-Feb-00 Minor type system fixes
|
||
v1.08 raymcc 22-Feb-00 Ajay's updates to type system
|
||
v1.09 alanbos 22-Mar-00 Added IUmiCustomInterfaceFactory
|
||
|
||
--*/
|
||
|
||
|
||
[uuid(12575a7a-d9db-11d3-a11f-00105a1f515a)]
|
||
|
||
library UMI_V6
|
||
{
|
||
importlib("stdole32.tlb");
|
||
|
||
interface IUmiPropList;
|
||
interface IUmiBaseObject;
|
||
interface IUmiObject;
|
||
interface IUmiConnection;
|
||
interface IUmiContainer;
|
||
interface IUmiCursor;
|
||
interface IUmiObjectSink;
|
||
interface IUmiURLKeyList;
|
||
interface IUmiURL;
|
||
interface IUmiQuery;
|
||
interface IUmiCustomInterfaceFactory;
|
||
|
||
typedef enum tag_UMI_TYPE_ENUMERATION
|
||
{
|
||
UMI_TYPE_NULL =0,
|
||
|
||
UMI_TYPE_I1 =1,
|
||
UMI_TYPE_I2 =2,
|
||
UMI_TYPE_I4 =3,
|
||
UMI_TYPE_I8 =4,
|
||
|
||
UMI_TYPE_UI1 =5,
|
||
UMI_TYPE_UI2 =6,
|
||
UMI_TYPE_UI4 =7,
|
||
UMI_TYPE_UI8 =8,
|
||
|
||
UMI_TYPE_R4 =9,
|
||
UMI_TYPE_R8 =10,
|
||
|
||
|
||
UMI_TYPE_FILETIME =12,
|
||
UMI_TYPE_SYSTEMTIME =13,
|
||
UMI_TYPE_BOOL =14,
|
||
UMI_TYPE_IDISPATCH =15,
|
||
UMI_TYPE_IUNKNOWN =16,
|
||
UMI_TYPE_VARIANT =17,
|
||
|
||
UMI_TYPE_LPWSTR =20,
|
||
UMI_TYPE_OCTETSTRING =21,
|
||
UMI_TYPE_UMIARRAY =22,
|
||
|
||
UMI_TYPE_DISCOVERY =23,
|
||
UMI_TYPE_UNDEFINED =24,
|
||
UMI_TYPE_DEFAULT =25,
|
||
|
||
UMI_TYPE_ARRAY_FLAG =0x2000
|
||
|
||
} UMI_TYPE_ENUMERATION;
|
||
|
||
// Allows for combining flags and such
|
||
typedef ULONG UMI_TYPE;
|
||
|
||
typedef enum
|
||
{
|
||
UMI_GENUS_CLASS = 1,
|
||
UMI_GENUS_INSTANCE = 2
|
||
} UMI_GENUS_TYPE;
|
||
|
||
typedef enum
|
||
{
|
||
UMI_DONT_COMMIT_SECURITY_DESCRIPTOR = 0x10
|
||
} UMI_COMMIT_FLAGS;
|
||
|
||
typedef enum
|
||
{
|
||
// Which properties to get
|
||
UMI_FLAG_GETPROPS_ALL = 1,
|
||
UMI_FLAG_GETPROPS_SCHEMA = 0x2,
|
||
UMI_MASK_GETPROPS_PROP = 0xFF,
|
||
|
||
// Extended modifiers (e.g. just names, etc.)
|
||
UMI_FLAG_GETPROPS_NAMES = 0x100,
|
||
UMI_MASK_GETPROPS_EXT = 0x100
|
||
} UMI_GETPROPS_FLAGS;
|
||
|
||
typedef enum
|
||
{
|
||
// Return a property list of a property
|
||
UMI_FLAG_OWNER_SECURITY_INFORMATION = 0x1,
|
||
UMI_FLAG_GROUP_SECURITY_INFORMATION = 0x2,
|
||
UMI_FLAG_DACL_SECURITY_INFORMATION = 0x4,
|
||
UMI_FLAG_SACL_SECURITY_INFORMATION = 0x8,
|
||
UMI_SECURITY_MASK = 0xF,
|
||
UMI_FLAG_PROVIDER_CACHE = 0x10,
|
||
// Retrieve property based on provider cache
|
||
UMI_FLAG_PROPERTY_ORIGIN = 0x20,
|
||
// Get the origin class of the property
|
||
} UMI_GET_FLAGS;
|
||
|
||
typedef enum
|
||
{
|
||
UMI_FLAG_REFRESH_ALL = 0, // Refresh all properties from cache
|
||
UMI_FLAG_REFRESH_PARTIAL = 1 // Refresh untouched properties from cache
|
||
} UMI_REFRESH_FLAGS;
|
||
|
||
typedef enum
|
||
{
|
||
UMI_OPERATION_NONE = 0, // Set when a property is retrieved
|
||
UMI_OPERATION_APPEND = 1, // DS supports this
|
||
UMI_OPERATION_UPDATE = 2, // DS supports this
|
||
UMI_OPERATION_EMPTY = 3, // DS supports this
|
||
UMI_OPERATION_INSERT_AT = 4,
|
||
UMI_OPERATION_REMOVE_AT = 5,
|
||
UMI_OPERATION_DELETE_AT = 6,
|
||
UMI_OPERATION_DELETE_FIRST_MATCH = 7, // DS supports this
|
||
UMI_OPERATION_DELETE_ALL_MATCHES = 8,
|
||
UMI_OPERATION_RESTORE_DEFAULT = 9
|
||
} UMI_PROP_INSTRUCTION;
|
||
|
||
// These flags are used for operations such as Delete, which may apply to instances
|
||
// or classes and the path may be abiguous
|
||
|
||
typedef enum
|
||
{
|
||
UMI_OPERATION_INSTANCE = 0X1000, // operation is for instance
|
||
UMI_OPERATION_CLASS = 0X2000
|
||
} UMI_OPERATION_PATH;
|
||
|
||
typedef enum
|
||
{
|
||
UMIPATH_CREATE_AS_NATIVE = 0x8000,
|
||
UMIPATH_CREATE_AS_EITHER = 0x4000,
|
||
UMIPATH_CREATE_ACCEPT_RELATIVE = 0x4,
|
||
} tag_UMI_PATH_CREATE_FLAG;
|
||
|
||
typedef enum tag_WMI_PATH_STATUS_FLAG
|
||
{
|
||
UMIPATH_INFO_NATIVE_STRING = 0x1, // path was set as native.
|
||
UMIPATH_INFO_RELATIVE_PATH = 0x2, // path has null server.
|
||
UMIPATH_INFO_INSTANCE_PATH = 0x4, // path has a key and/or value.
|
||
UMIPATH_INFO_CLASS_PATH = 0x8,
|
||
UMIPATH_INFO_SINGLETON_PATH = 0x10,
|
||
|
||
} tag_UMI_PATH_STATUS_FLAG;
|
||
|
||
///////////////////////////////////////////////////////////////////////
|
||
//
|
||
// UMI ERROR CODES
|
||
|
||
/*
|
||
Standard codes from WINERROR.H:
|
||
|
||
S_OK (Zero) Success
|
||
E_ACCESS_DENIED Access denied (security violation)
|
||
|
||
E_NOINTERFACE Interface not available (from QueryInterface only)
|
||
E_UNEXPECTED Unhandled internal exception; should not be seen by client code
|
||
E_NOTIMPL API is not implemented (this is not to be returned when a feature of the API is not implemented while other parts are)
|
||
E_OUTOFMEMORY Insufficient system memory to comply with the request
|
||
E_FAIL Generic failure of operation; call IUmiBaseObject::GetCallResult for more detail.
|
||
E_INVALIDARG One or more arguments was not valid
|
||
|
||
*/
|
||
|
||
// UMI-Specific Errors
|
||
|
||
typedef enum
|
||
{
|
||
UMI_S_NO_ERROR = 0,
|
||
|
||
UMI_E_CONNECTION_FAILURE = 0x80041001,
|
||
|
||
UMI_E_TIMED_OUT = 0x80041002, // Call timed out
|
||
UMI_E_TYPE_MISMATCH = 0x80041003, // Wrong value type supplied for a property
|
||
UMI_E_NOT_FOUND = 0x80041004, // Object, property, etc. not found
|
||
UMI_E_INVALID_FLAGS = 0x80041005, // Flag mask was not a valid combination
|
||
UMI_E_UNSUPPORTED_FLAGS = 0x80041006, // Flags valid, but not supported in this case
|
||
UMI_E_SYNCHRONIZATION_REQUIRED = 0x80041007, // Internal cache requires a Commit or a Refresh before continuing
|
||
UMI_E_UNSUPPORTED_OPERATION = 0x80041008, // Operation is legal but unsupported in this provider
|
||
UMI_E_TRANSACTION_FAILURE = 0x80041009, // Transaction failed due to conflict with another transaction or forced rollback at the server
|
||
UMI_E_UNBOUND_OBJECT = 0x8004100A // The object is newly created and therefore unbound.
|
||
|
||
} UMI_STATUS;
|
||
|
||
///////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
typedef struct tag_UMI_OCTET_STRING
|
||
{
|
||
ULONG uLength;
|
||
byte *lpValue;
|
||
|
||
} UMI_OCTET_STRING, *PUMI_OCTET_STRING;
|
||
|
||
|
||
typedef struct tag_UMI_COM_OBJECT
|
||
{
|
||
IID *priid;
|
||
LPVOID pInterface;
|
||
|
||
} UMI_COM_OBJECT, *PUMI_COM_OBJECT;
|
||
|
||
|
||
|
||
typedef union
|
||
{
|
||
CHAR cValue[1];
|
||
UCHAR ucValue[1];
|
||
WCHAR wcValue[1];
|
||
WORD wValue[1];
|
||
DWORD dwValue[1];
|
||
LONG lValue[1];
|
||
ULONG uValue[1];
|
||
BYTE byteValue[1];
|
||
BOOL bValue[1];
|
||
LPWSTR pszStrValue[1];
|
||
FILETIME fileTimeValue[1];
|
||
SYSTEMTIME sysTimeValue[1];
|
||
double dblValue[1];
|
||
|
||
unsigned __int64 uValue64[1];
|
||
__int64 nValue64[1];
|
||
UMI_OCTET_STRING octetStr[1];
|
||
UMI_COM_OBJECT comObject[1];
|
||
|
||
} UMI_VALUE, *PUMI_VALUE;
|
||
|
||
typedef struct
|
||
{
|
||
UMI_TYPE uType;
|
||
ULONG uCount; // Array fields of UMIVALUE only valid when used with this
|
||
ULONG uOperationType;
|
||
LPWSTR pszPropertyName;
|
||
UMI_VALUE *pUMIValue; // NULL when the value is actually NULL
|
||
} UMI_PROPERTY, *PUMI_PROPERTY;
|
||
|
||
typedef struct
|
||
{
|
||
ULONG uCount;
|
||
UMI_PROPERTY *pPropArray;
|
||
|
||
} UMI_PROPERTY_VALUES, *PUMI_PROPERTY_VALUES;
|
||
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
//***********************************************************************
|
||
// ok
|
||
|
||
[object, local, uuid(12575a7c-d9db-11d3-a11f-00105a1f515a)]
|
||
|
||
interface IUmiBaseObject : IUmiPropList
|
||
{
|
||
HRESULT GetLastStatus(
|
||
[in] ULONG uFlags,
|
||
[out] ULONG *puSpecificStatus,
|
||
[in] REFIID riid,
|
||
[out, iid_is(riid)] LPVOID *pStatusObj // NULL=don't use
|
||
);
|
||
|
||
// Exports IErrorInfo, IUmiPropList
|
||
// Changes after every call to an interface method
|
||
|
||
HRESULT GetInterfacePropList(
|
||
[in] ULONG uFlags, // Overloaded
|
||
[out] IUmiPropList **pPropList
|
||
);
|
||
};
|
||
|
||
|
||
//***************************************************************************
|
||
|
||
|
||
[object, local, uuid(12575a7b-d9db-11d3-a11f-00105a1f515a)]
|
||
|
||
interface IUmiPropList : IUnknown
|
||
{
|
||
// This is IUmiObject without the connection implied by Refresh/Commit, etc.
|
||
// It represents the property list portion of the object.
|
||
|
||
HRESULT Put(
|
||
[in] LPCWSTR pszName,
|
||
[in] ULONG uFlags,
|
||
[in] UMI_PROPERTY_VALUES *pProp
|
||
);
|
||
|
||
HRESULT Get(
|
||
[in] LPCWSTR pszName,
|
||
[in] ULONG uFlags,
|
||
[out] UMI_PROPERTY_VALUES **pProp
|
||
);
|
||
|
||
HRESULT GetAt(
|
||
[in] LPCWSTR pszName,
|
||
[in] ULONG uFlags,
|
||
[in] ULONG uBufferLength, // Buffer size in bytes
|
||
[out] LPVOID pExistingMem // Single-valued UMI_LPWSTR and numeric types
|
||
);
|
||
|
||
HRESULT GetAs(
|
||
[in] LPCWSTR pszName,
|
||
[in] ULONG uFlags,
|
||
[in] ULONG uCoercionType,
|
||
[out] UMI_PROPERTY_VALUES **pProp
|
||
);
|
||
|
||
HRESULT FreeMemory(
|
||
ULONG uReserved,
|
||
LPVOID pMem
|
||
);
|
||
|
||
HRESULT Delete(
|
||
[in] LPCWSTR pszName,
|
||
[in] ULONG uFlags
|
||
);
|
||
|
||
|
||
// Functions for dealing with multiple properties at one time.
|
||
// ===========================================================
|
||
|
||
HRESULT GetProps(
|
||
[in] LPCWSTR *pszNames,
|
||
[in] ULONG uNameCount,
|
||
[in] ULONG uFlags, // option: UMI_FLAG_GET_NAMES
|
||
[out] UMI_PROPERTY_VALUES **pProps
|
||
);
|
||
// Also used for "GetNames" functionality.
|
||
|
||
|
||
HRESULT PutProps(
|
||
[in] LPCWSTR *pszNames, // null-separated, double-null-terminated
|
||
[in] ULONG uNameCount,
|
||
[in] ULONG uFlags, // PUT_WITH_COMMIT
|
||
[in] UMI_PROPERTY_VALUES *pProps
|
||
);
|
||
|
||
|
||
HRESULT PutFrom(
|
||
[in] LPCWSTR pszName,
|
||
[in] ULONG uFlags,
|
||
[in] ULONG uBufferLength,
|
||
[in] LPVOID pExistingMem
|
||
);
|
||
};
|
||
|
||
|
||
//*******************************************************************
|
||
// NOT CoCreatable; get this from IUmiPath. This interface is used to
|
||
// handle the multiple keys available in wmi.
|
||
|
||
[local, object, uuid(cf779c98-4739-4fd4-a415-da937a599f2f)]
|
||
|
||
interface IUmiURLKeyList : IUnknown
|
||
{
|
||
HRESULT GetCount(
|
||
[out] ULONG * puKeyCount
|
||
);
|
||
|
||
HRESULT SetKey(
|
||
[in, string] LPCWSTR pszName,
|
||
[in, string] LPCWSTR pszValue
|
||
);
|
||
|
||
HRESULT GetKey(
|
||
[in] ULONG uKeyIx,
|
||
[in] ULONG uFlags, // TBD as needed
|
||
[in,out] ULONG * puKeyNameBufSize,
|
||
[in] LPWSTR pszKeyName, // Set to key name
|
||
[in,out] ULONG * puValueBufSize,
|
||
[in] LPWSTR pszValue // Set to key value
|
||
);
|
||
|
||
HRESULT RemoveKey(
|
||
[in, string] LPCWSTR pszName,
|
||
[in] ULONG uFlags
|
||
);
|
||
|
||
HRESULT RemoveAllKeys(
|
||
[in] ULONG uFlags
|
||
);
|
||
|
||
// UMIPATH_INFO_IS_GUID <true if guid={}>
|
||
|
||
HRESULT GetKeysInfo(
|
||
[in] ULONG uRequestedInfo,
|
||
[out] ULONGLONG *puResponse
|
||
);
|
||
|
||
};
|
||
|
||
//***********************************************************************
|
||
// This is the main interface. It is a blend of the WMIPathParser and the
|
||
// DS path cracker interfaces.
|
||
|
||
[object, local, uuid(12575a7d-d9db-11d3-a11f-00105a1f515a)]
|
||
|
||
interface IUmiURL : IUnknown
|
||
{
|
||
|
||
// Main functins for getting and setting the path
|
||
|
||
HRESULT Set([in] long lFlags, [in] LPCWSTR pszText); // see tag_UMI_PATH_CREATE_FLAG
|
||
HRESULT Get([in] long lFlags, [in,out] ULONG * puBufSize, [in,string] LPWSTR pszDest);
|
||
|
||
// Path tests. To be determined. As a minimum, could be used to check for
|
||
// validity of created paths.
|
||
|
||
HRESULT GetPathInfo(
|
||
[in] ULONG uRequestedInfo, // zero for now
|
||
[out] ULONGLONG *puResponse // see tag_UMI_PATH_STATUS_FLAG
|
||
);
|
||
|
||
// Locator (AKA Server) access
|
||
|
||
HRESULT SetLocator(
|
||
[in, string] LPCWSTR Name
|
||
);
|
||
|
||
HRESULT GetLocator(
|
||
[in,out] ULONG * puNameBufLength,
|
||
[in, string] LPWSTR pName
|
||
);
|
||
|
||
// Root namespace access. This manipulates the "wmi" or "ds" part.
|
||
// =============
|
||
|
||
HRESULT SetRootNamespace(
|
||
[in, string] LPCWSTR Name
|
||
);
|
||
|
||
HRESULT GetRootNamespace(
|
||
[in,out] ULONG * puNameBufLength,
|
||
[in, out, string] LPWSTR pName
|
||
);
|
||
|
||
// Component access. The leftmost component is 0
|
||
|
||
HRESULT GetComponentCount(
|
||
[out] ULONG *puCount
|
||
);
|
||
|
||
HRESULT SetComponent(
|
||
[in] ULONG uIndex,
|
||
[in] LPWSTR pszClass
|
||
);
|
||
|
||
HRESULT SetComponentFromText(
|
||
[in] ULONG uIndex,
|
||
[in] LPWSTR pszText
|
||
);
|
||
|
||
HRESULT GetComponent(
|
||
[in] ULONG uIndex,
|
||
[in,out] ULONG * puClassNameBufSize,
|
||
[in,out] LPWSTR pszClass,
|
||
[out] IUmiURLKeyList **pKeyList
|
||
);
|
||
|
||
HRESULT GetComponentAsText(
|
||
[in] ULONG uIndex,
|
||
[in,out] ULONG * puTextBufSize,
|
||
[in,out] LPWSTR pszText
|
||
);
|
||
|
||
HRESULT RemoveComponent(
|
||
[in] ULONG uIndex
|
||
);
|
||
|
||
HRESULT RemoveAllComponents(
|
||
);
|
||
|
||
// The rightmost component is treated specially. Both the wmi path parser and ds
|
||
// path crackers do this.
|
||
|
||
HRESULT SetLeafName(
|
||
[in, string] LPCWSTR Name
|
||
);
|
||
|
||
HRESULT GetLeafName(
|
||
[in,out] ULONG * puBuffLength,
|
||
[in, out, string] LPWSTR pszName
|
||
);
|
||
|
||
HRESULT GetKeyList(
|
||
[out] IUmiURLKeyList ** pOut
|
||
);
|
||
|
||
HRESULT CreateLeafPart(
|
||
[in] long lFlags,
|
||
[in, string] LPCWSTR Name
|
||
);
|
||
|
||
HRESULT DeleteLeafPart(
|
||
[in] long lFlags
|
||
);
|
||
};
|
||
|
||
|
||
//***********************************************************************
|
||
// ok
|
||
|
||
[object, local, uuid(12575a7e-d9db-11d3-a11f-00105a1f515a)]
|
||
|
||
interface IUmiQuery : IUmiBaseObject
|
||
{
|
||
HRESULT Set(
|
||
[in] LPCWSTR pszLanguage,
|
||
[in] ULONG uFlags,
|
||
[in] LPCWSTR pszText
|
||
);
|
||
|
||
|
||
HRESULT GetQuery(
|
||
[in, out] ULONG * puLangBufSize,
|
||
[in, out] LPWSTR pszLangBuf,
|
||
[in, out] ULONG * puQueryTextBufSize,
|
||
[in, out] LPWSTR pszQueryTextBuf
|
||
);
|
||
|
||
/* Houses the query properties. Typically, query for
|
||
IUmiObject or IUmiObjectMulti, so that all properties
|
||
can be retrieved/set/deleted in one call.
|
||
*/
|
||
|
||
// Query info also exposed as properties:
|
||
// "QUERYTEXT" = "select * from Foo"
|
||
// "QUERYLANGUAGE" = "SQL"
|
||
};
|
||
|
||
|
||
//***********************************************************************
|
||
// ok
|
||
|
||
|
||
[object, local, uuid(5ed7ee26-64a4-11d3-a0da-00105a1f515a)]
|
||
|
||
interface IUmiCursor : IUmiBaseObject
|
||
{
|
||
// Timeout settings, etc. available from GetInterfacePropList
|
||
|
||
HRESULT SetIID([in] REFIID riid);
|
||
// IUmiObject by default if you never call this
|
||
// Takes effect immediately after
|
||
|
||
HRESULT Reset();
|
||
// Must move to true beginning of enumeration or return E_NOTIMPL
|
||
|
||
HRESULT Next(
|
||
[in] ULONG uNumRequested,
|
||
[out] ULONG *puNumReturned,
|
||
[out, size_is(uNumRequested), length_is(*puNumReturned)] LPVOID *pObjects
|
||
);
|
||
|
||
HRESULT Count(
|
||
[out] ULONG *puNumObjects
|
||
);
|
||
// May return E_NOTIMPL
|
||
|
||
HRESULT Previous(
|
||
[in] ULONG uFlags,
|
||
[out] LPVOID *pObj
|
||
);
|
||
// May return E_NOTIMPL
|
||
};
|
||
|
||
|
||
//***********************************************************************
|
||
// ok
|
||
|
||
[object, local, uuid(5ed7ee20-64a4-11d3-a0da-00105a1f515a)]
|
||
|
||
interface IUmiConnection : IUmiBaseObject
|
||
{
|
||
HRESULT Open(
|
||
[in] IUmiURL *pURL,
|
||
[in] ULONG uFlags,
|
||
[in] REFIID TargetIID,
|
||
[out, iid_is(TargetIID)] void **ppvRes
|
||
);
|
||
|
||
// Timeouts, etc., are configured using a call to GetInterfaceProps
|
||
};
|
||
|
||
|
||
//***********************************************************************
|
||
// ok
|
||
|
||
[object, local, uuid(5ed7ee21-64a4-11d3-a0da-00105a1f515a)]
|
||
|
||
interface IUmiContainer : IUmiObject
|
||
{
|
||
|
||
HRESULT Open(
|
||
[in] IUmiURL *pURL,
|
||
[in] ULONG uFlags, // UMI_OPERATION_PATH
|
||
[in] REFIID TargetIID,
|
||
[out, iid_is(TargetIID)] void **ppvRes
|
||
);
|
||
|
||
/*
|
||
HRESULT Get(
|
||
[in] IUmiURL *pURL,
|
||
[in] ULONG uFlags,
|
||
[in] REFIID TargetIID,
|
||
[out, iid_is(TargetIID)] void **ppvResult
|
||
);
|
||
*/
|
||
|
||
HRESULT PutObject(
|
||
[in] ULONG uFlags,
|
||
[in] REFIID TargetIID,
|
||
[in, out, iid_is(TargetIID)] void *pObj
|
||
);
|
||
// May return E_NOTIMPL, as there is overlap with IUmiObject::Commit
|
||
|
||
|
||
HRESULT DeleteObject(
|
||
[in] IUmiURL *pURL,
|
||
[in, optional] ULONG uFlags // UMI_OPERATION_PATH
|
||
);
|
||
|
||
HRESULT Create(
|
||
[in] IUmiURL *pURL,
|
||
[in] ULONG uFlags, // UMI_OPERATION_PATH
|
||
[out] IUmiObject **pNewObj
|
||
);
|
||
|
||
HRESULT Move(
|
||
[in] ULONG uFlags,
|
||
[in] IUmiURL *pOldURL,
|
||
[in] IUmiURL *pNewURL
|
||
);
|
||
|
||
HRESULT CreateEnum(
|
||
[in] IUmiURL *pszEnumContext, // class name, etc. etc.
|
||
[in] ULONG uFlags, // UMI_OPERATION_PATH
|
||
[in] REFIID TargetIID,
|
||
[out, iid_is(TargetIID)] void **ppvEnum
|
||
);
|
||
|
||
HRESULT ExecQuery(
|
||
[in] IUmiQuery *pQuery,
|
||
[in] ULONG uFlags,
|
||
[in] REFIID TargetIID,
|
||
[out, iid_is(TargetIID)] void **ppResult
|
||
);
|
||
};
|
||
|
||
|
||
//***********************************************************************
|
||
// ok
|
||
// Since this is a callback, there is little reason to have interface
|
||
// properties. Not only that, the minimum implementation is too heavy;
|
||
// this interface is supposed to be implemented by the client side,
|
||
// so deriving from IUmiBaseObject is too much.
|
||
//
|
||
|
||
[object, local, uuid(5ed7ee24-64a4-11d3-a0da-00105a1f515a)]
|
||
|
||
interface IUmiObjectSink : IUnknown
|
||
{
|
||
HRESULT Put(
|
||
[in] LONG lNumObjects,
|
||
[in, size_is(lNumObjects)] IUmiObject **ppObjects
|
||
);
|
||
|
||
HRESULT SetResult(
|
||
[in] HRESULT hResStatus,
|
||
[in] ULONG uFlags,
|
||
[in] IUnknown *pObject // QI for IErrorInfo, IUmiObject, etc.
|
||
);
|
||
};
|
||
|
||
|
||
//***********************************************************************
|
||
// ok
|
||
|
||
[object, local, uuid(5ed7ee23-64a4-11d3-a0da-00105a1f515a)]
|
||
|
||
interface IUmiObject : IUmiBaseObject
|
||
{
|
||
// Get/Put is on IUmiBaseObject
|
||
|
||
HRESULT Clone(
|
||
[in] ULONG uFlags,
|
||
[in] REFIID riid,
|
||
[out, iid_is(riid)] LPVOID *pCopy
|
||
);
|
||
|
||
/*
|
||
Clones the current object exactly, including any connections and alternate interfaces, if possible.
|
||
<uFlags> = should this allow cloning of entire connections or just the IUmiObject/PropList part, etc?
|
||
*/
|
||
|
||
HRESULT CopyTo(
|
||
[in] ULONG uFlags,
|
||
[in] IUmiURL *pURL,
|
||
[in] REFIID riid,
|
||
[out, iid_is(riid)] LPVOID *pCopy
|
||
);
|
||
|
||
HRESULT Refresh(
|
||
[in] ULONG uFlags,
|
||
[in] ULONG uNameCount,
|
||
[in] LPWSTR *pszNames
|
||
);
|
||
|
||
HRESULT Commit(
|
||
[in] ULONG uFlags
|
||
);
|
||
|
||
/*
|
||
uFlags == CREATE_ONLY UPDATE_ONLY CREATE_OR_UDPATE = 0 (default)
|
||
*/
|
||
|
||
|
||
// Security Descriptor is a standard property, not an API
|
||
|
||
};
|
||
|
||
[restricted, uuid(d4b21cc2-f2a5-453e-8459-b27f362cb0e0)]
|
||
coclass UmiDefURL
|
||
{
|
||
interface IUmiURL;
|
||
};
|
||
|
||
|
||
//***********************************************************************
|
||
//
|
||
// This should always be QI'able from IUmiObject. It is not derived from
|
||
// IUmiBaseObject since we assume that that functionality is taken care of
|
||
// by IUmiObject.
|
||
|
||
[object, local, uuid(14CD599E-2BE7-4c6f-B95B-B150DCD93585)]
|
||
|
||
interface IUmiCustomInterfaceFactory : IUnknown
|
||
{
|
||
// Returns matching CLSID for requested IID
|
||
HRESULT GetCLSIDForIID (
|
||
[in] REFIID riid, // IID to match on
|
||
[in] long lFlags, // Reserved. Must be 0
|
||
[in, out] CLSID *pCLSID // returned CLSID
|
||
);
|
||
|
||
// Creates (possibly aggregated) object of given CLSID and returns interface
|
||
HRESULT GetObjectByCLSID (
|
||
[in] CLSID clsid, // The CLSID to create
|
||
[in] IUnknown *pUnkOuter, // Outer unknown for aggregation
|
||
[in] DWORD dwClsContext, // Context for running executable code
|
||
[in] REFIID riid, // Requested interface
|
||
[in] long lFlags, // Reserved. Must be 0
|
||
[out, iid_is(riid)] void **ppInterface // Returned interface
|
||
);
|
||
|
||
// Provides DISPIDs for Names and the CLSID for the object that supports them
|
||
HRESULT GetCLSIDForNames(
|
||
[in, size_is(cNames)] LPOLESTR * rgszNames,
|
||
[in] UINT cNames,
|
||
[in] LCID lcid,
|
||
[out, size_is(cNames)] DISPID * rgDispId,
|
||
[in] long lFlags, // Reserved. Must be 0
|
||
[in, out] CLSID *pCLSID // The supporting CLSID (if found)
|
||
);
|
||
};
|
||
};
|
||
|
||
|
||
|