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)
|
|||
|
);
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|