mirror of https://github.com/dahall/Vanara.git
2653 lines
147 KiB
C#
2653 lines
147 KiB
C#
using System;
|
||
using System.Runtime.InteropServices;
|
||
using System.Runtime.InteropServices.ComTypes;
|
||
using BIND_OPTS = System.Runtime.InteropServices.ComTypes.BIND_OPTS;
|
||
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
|
||
|
||
namespace Vanara.PInvoke
|
||
{
|
||
public static partial class Ole32
|
||
{
|
||
/// <summary>Specifies different types of apartments.</summary>
|
||
// https://docs.microsoft.com/en-us/windows/desktop/api/objidl/ne-objidl-_apttype typedef enum _APTTYPE { APTTYPE_CURRENT,
|
||
// APTTYPE_STA, APTTYPE_MTA, APTTYPE_NA, APTTYPE_MAINSTA } APTTYPE;
|
||
[PInvokeData("objidl.h", MSDNShortId = "eae95b1f-3883-4334-aa7e-84e71e05fb24")]
|
||
public enum APTTYPE
|
||
{
|
||
/// <summary>The current thread.</summary>
|
||
APTTYPE_CURRENT = -1,
|
||
|
||
/// <summary>A single-threaded apartment.</summary>
|
||
APTTYPE_STA = 0,
|
||
|
||
/// <summary>A multi-threaded apartment.</summary>
|
||
APTTYPE_MTA = 1,
|
||
|
||
/// <summary>A neutral apartment.</summary>
|
||
APTTYPE_NA = 2,
|
||
|
||
/// <summary>The main single-threaded apartment.</summary>
|
||
APTTYPE_MAINSTA = 3,
|
||
}
|
||
|
||
/// <summary>Specifies the set of possible COM apartment type qualifiers.</summary>
|
||
// https://docs.microsoft.com/en-us/windows/desktop/api/objidlbase/ne-objidlbase-apttypequalifier typedef enum _APTTYPEQUALIFIER {
|
||
// APTTYPEQUALIFIER_NONE, APTTYPEQUALIFIER_IMPLICIT_MTA, APTTYPEQUALIFIER_NA_ON_MTA, APTTYPEQUALIFIER_NA_ON_STA,
|
||
// APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA, APTTYPEQUALIFIER_NA_ON_MAINSTA, APTTYPEQUALIFIER_APPLICATION_STA, APTTYPEQUALIFIER_RESERVED_1
|
||
// } APTTYPEQUALIFIER;
|
||
[PInvokeData("objidlbase.h", MSDNShortId = "ac28076d-d266-4939-b6c1-d56494ffbcd8")]
|
||
public enum APTTYPEQUALIFIER
|
||
{
|
||
/// <summary>No qualifier information for the current COM apartment type is available.</summary>
|
||
APTTYPEQUALIFIER_NONE = 0,
|
||
|
||
/// <summary>
|
||
/// This qualifier is only valid when the pAptType parameter of the CoGetApartmentType function specifies APTTYPE_MTA on return.
|
||
/// A thread has an implicit MTA apartment type if it does not initialize the COM apartment itself, and if another thread has
|
||
/// already initialized the MTA in the process. This qualifier informs the API caller that the MTA of the thread is implicitly
|
||
/// inherited from other threads and is not initialized directly.
|
||
/// </summary>
|
||
APTTYPEQUALIFIER_IMPLICIT_MTA,
|
||
|
||
/// <summary>
|
||
/// This qualifier is only valid when the pAptType parameter of the CoGetApartmentType function contains APTTYPE_NA on return.
|
||
/// When an MTA thread creates or invokes a COM in-process object using the "Neutral" threading model, the COM apartment type of
|
||
/// the thread switches from MTA to a Neutral apartment type. This qualifier informs the API caller that the thread has switched
|
||
/// from the MTA apartment type to the NA type.
|
||
/// </summary>
|
||
APTTYPEQUALIFIER_NA_ON_MTA,
|
||
|
||
/// <summary>
|
||
/// This qualifier is only valid when the pAptType parameter of the CoGetApartmentType function contains APTTYPE_NA on return.
|
||
/// When an STA thread creates or invokes a COM in-process object using the "Neutral" threading model, the COM apartment type of
|
||
/// the thread switches from STA to a Neutral apartment type. This qualifier informs the API caller that the thread has switched
|
||
/// from the STA apartment type to the NA type.
|
||
/// </summary>
|
||
APTTYPEQUALIFIER_NA_ON_STA,
|
||
|
||
/// <summary>
|
||
/// This qualifier is only valid when the pAptType parameter of the CoGetApartmentType function contains APTTYPE_NA on return.
|
||
/// When an implicit MTA thread creates or invokes a COM in-process object using the "Neutral" threading model, the COM apartment
|
||
/// type of the thread switches from the implicit MTA type to a Neutral apartment type. This qualifier informs the API caller
|
||
/// that the thread has switched from the implicit MTA apartment type to the NA type.
|
||
/// </summary>
|
||
APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA,
|
||
|
||
/// <summary>
|
||
/// This qualifier is only valid when the pAptType parameter of the CoGetApartmentType function contains APTTYPE_NA on return.
|
||
/// When the main STA thread creates or invokes a COM in-process object using the "Neutral" threading model, the COM apartment
|
||
/// type of the thread switches from the main STA type to a Neutral apartment type. This qualifier informs the API caller that
|
||
/// the thread has switched from the main STA apartment type to the NA type.
|
||
/// </summary>
|
||
APTTYPEQUALIFIER_NA_ON_MAINSTA,
|
||
|
||
/// <summary/>
|
||
APTTYPEQUALIFIER_APPLICATION_STA,
|
||
|
||
/// <summary/>
|
||
APTTYPEQUALIFIER_RESERVED_1,
|
||
}
|
||
|
||
/// <summary>
|
||
/// Values that are used in activation calls to indicate the execution contexts in which an object is to be run. These values are
|
||
/// also used in calls to CoRegisterClassObject to indicate the set of execution contexts in which a class object is to be made
|
||
/// available for requests to construct instances.
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// Values from the <c>CLSCTX</c> enumeration are used in activation calls (CoCreateInstance, CoCreateInstanceEx, CoGetClassObject,
|
||
/// and so on) to indicate the preferred execution contexts—in-process, local, or remote—in which an object is to be run. They
|
||
/// are also used in calls to CoRegisterClassObject to indicate the set of execution contexts in which a class object is to be made
|
||
/// available for requests to construct instances ( <c>IClassFactory::CreateInstance</c>).
|
||
/// </para>
|
||
/// <para>
|
||
/// To indicate that more than one context is acceptable, you can combine multiple values with Boolean ORs. The contexts are tried in
|
||
/// the order in which they are listed.
|
||
/// </para>
|
||
/// <para>
|
||
/// Given a set of <c>CLSCTX</c> flags, the execution context to be used depends on the availability of registered class codes and
|
||
/// other parameters according to the following algorithm.
|
||
/// </para>
|
||
/// <list type="number">
|
||
/// <item>
|
||
/// <term>
|
||
/// If the call specifies one of the following, CLSCTX_REMOTE_SERVER is implied and is added to the list of flags: The second case
|
||
/// allows applications written prior to the release of distributed COM to be the configuration of classes for remote activation to
|
||
/// be used by client applications available prior to DCOM and the CLSCTX_REMOTE_SERVER flag. The cases in which there would be no
|
||
/// explicit COSERVERINFO structure are when the value is specified as <c>NULL</c> or when it is not one of the function parameters
|
||
/// (as in calls to CoCreateInstance and CoGetClassObject).
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>If the explicit COSERVERINFO parameter indicates the current computer, CLSCTX_REMOTE_SERVER is removed if present.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para>The rest of the processing proceeds by looking at the value(s) in the following sequence:</para>
|
||
/// <list type="number">
|
||
/// <item>
|
||
/// <term>
|
||
/// If the flags include CLSCTX_REMOTE_SERVER and no COSERVERINFO parameter is specified and if the activation request indicates a
|
||
/// persistent state from which to initialize the object (with CoGetInstanceFromFile, CoGetInstanceFromIStorage, or, for a file
|
||
/// moniker, in a call to IMoniker::BindToObject) and the class has an ActivateAtStorage subkey or no class registry information
|
||
/// whatsoever, the request to activate and initialize is forwarded to the computer where the persistent state resides. (Refer to the
|
||
/// remote activation functions listed in the See Also section for details.)
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the flags include CLSCTX_INPROC_SERVER, the class code in the DLL found under the class's InprocServer32 key is used if this
|
||
/// key exists. The class code will run within the same process as the caller.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the flags include CLSCTX_INPROC_HANDLER, the class code in the DLL found under the class's InprocHandler32 key is used if this
|
||
/// key exists. The class code will run within the same process as the caller.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the flags include CLSCTX_LOCAL_SERVER, the class code in the service found under the class's LocalService key is used if this
|
||
/// key exists. If no service is specified but an EXE is specified under that same key, the class code associated with that EXE is
|
||
/// used. The class code (in either case) will be run in a separate service process on the same computer as the caller.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the flag is set to CLSCTX_REMOTE_SERVER and an additional COSERVERINFO parameter to the function specifies a particular remote
|
||
/// computer, a request to activate is forwarded to this remote computer with flags modified to set to CLSCTX_LOCAL_SERVER. The class
|
||
/// code will run in its own process on this specific computer, which must be different from that of the caller.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// Finally, if the flags include CLSCTX_REMOTE_SERVER and no COSERVERINFO parameter is specified and if a computer name is given
|
||
/// under the class's RemoteServerName named-value, the request to activate is forwarded to this remote computer with the flags
|
||
/// modified to be set to CLSCTX_LOCAL_SERVER. The class code will run in its own process on this specific computer, which must be
|
||
/// different from that of the caller.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para>CLSCTX_ACTIVATE_32_BIT_SERVER and CLSCTX_ACTIVATE_64_BIT_SERVER</para>
|
||
/// <para>
|
||
/// The 64-bit versions of Windows introduce two new flags: CLSCTX_ACTIVATE_32_BIT_SERVER and CLSCTX_ACTIVATE_64_BIT_SERVER. On a
|
||
/// 64-bit computer, a 32-bit and 64-bit version of the same COM server may coexist. When a client requests an activation of an
|
||
/// out-of-process server, these <c>CLSCTX</c> flags allow the client to specify a 32-bit or a 64-bit version of the server.
|
||
/// </para>
|
||
/// <para>
|
||
/// Usually, a client will not care whether it uses a 32-bit or a 64-bit version of the server. However, if the server itself loads
|
||
/// an additional in-process server, then it and the in-process server must both be either 32-bit or 64-bit. For example, suppose
|
||
/// that the client wants to use a server "A", which in turn loads an in-process server "B". If only a 32-bit version of server "B"
|
||
/// is available, then the client must specify the 32-bit version of server "A". If only a 64-bit version of server "B" is available,
|
||
/// then the client must specify the 64-bit version of server "A".
|
||
/// </para>
|
||
/// <para>
|
||
/// A server can specify its own architecture preference via the PreferredServerBitness registry key, but the client's preference,
|
||
/// specified via a CLSCTX_ACTIVATE_32_BIT_SERVER or CLSCTX_ACTIVATE_64_BIT_SERVER flag, will override the server's preference. If
|
||
/// the client does not specify a preference, then the server's preference will be used.
|
||
/// </para>
|
||
/// <para>If neither the client nor the server specifies a preference, then:</para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>
|
||
/// If the computer that hosts the server is running Windows Server 2003 with Service Pack 1 (SP1) or a later system, then COM will
|
||
/// try to match the server architecture to the client architecture. In other words, for a 32-bit client, COM will activate a 32-bit
|
||
/// server if available; otherwise it will activate a 64-bit version of the server. For a 64-bit client, COM will activate a 64-bit
|
||
/// server if available; otherwise it will activate a 32-bit server.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the computer that hosts the server is running Windows XP or Windows Server 2003 without SP1 or later installed, then COM will
|
||
/// prefer a 64-bit version of the server if available; otherwise it will activate a 32-bit version of the server.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para>
|
||
/// If a <c>CLSCTX</c> enumeration has both the CLSCTX_ACTIVATE_32_BIT_SERVER and CLSCTX_ACTIVATE_64_BIT_SERVER flags set, then it is
|
||
/// invalid and the activation will return E_INVALIDARG.
|
||
/// </para>
|
||
/// <para>
|
||
/// The following table shows the results of the various combinations of client architectures and client settings and server
|
||
/// architectures and server settings.
|
||
/// </para>
|
||
/// <para>
|
||
/// The flags CLSCTX_ACTIVATE_32_BIT_SERVER and CLSCTX_ACTIVATE_64_BIT_SERVER flow across computer boundaries. If the computer that
|
||
/// hosts the server is running the 64-bit Windows, then it will honor these flags; otherwise it will ignore them.
|
||
/// </para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term/>
|
||
/// <term>32-bit client, no flag</term>
|
||
/// <term>64-bit client, no flag</term>
|
||
/// <term>32-bit client, 32-bit flag¹</term>
|
||
/// <term>32-bit client, 64-bit flag²</term>
|
||
/// <term>64-bit client, 32-bit flag¹</term>
|
||
/// <term>64-bit client, 64-bit flag²</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>32-bit server, match client registry value³</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>32-bit server, 32-bit registry value⁴</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>32-bit server, 64-bit registry value⁵</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>32-bit server, no registry value⁶</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>64/32⁹</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>32-bit server, no registry value (before Windows Server 2003 with SP1)⁷</term>
|
||
/// <term>64/32⁹</term>
|
||
/// <term>64/32⁹</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>32-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>64-bit server, match client registry value³</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>64-bit server, 32-bit registry value⁴</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>64-bit server, 64-bit registry value⁵</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>64-bit server, no registry value⁶</term>
|
||
/// <term>32/64¹⁰</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>64-bit server, no registry value (before Windows Server 2003 with SP1)⁷</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// <term>See ⁸</term>
|
||
/// <term>64-bit server</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para><c>PreferredServerBitness</c> PreferredServerBitness <c>PreferredServerBitness</c><c>PreferredServerBitness</c><c>PreferredServerBitness</c><c>PreferredServerBitness</c></para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/desktop/api/wtypesbase/ne-wtypesbase-tagclsctx typedef enum tagCLSCTX {
|
||
// CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER, CLSCTX_INPROC_SERVER16, CLSCTX_REMOTE_SERVER,
|
||
// CLSCTX_INPROC_HANDLER16, CLSCTX_RESERVED1, CLSCTX_RESERVED2, CLSCTX_RESERVED3, CLSCTX_RESERVED4, CLSCTX_NO_CODE_DOWNLOAD,
|
||
// CLSCTX_RESERVED5, CLSCTX_NO_CUSTOM_MARSHAL, CLSCTX_ENABLE_CODE_DOWNLOAD, CLSCTX_NO_FAILURE_LOG, CLSCTX_DISABLE_AAA,
|
||
// CLSCTX_ENABLE_AAA, CLSCTX_FROM_DEFAULT_CONTEXT, CLSCTX_ACTIVATE_X86_SERVER, CLSCTX_ACTIVATE_32_BIT_SERVER,
|
||
// CLSCTX_ACTIVATE_64_BIT_SERVER, CLSCTX_ENABLE_CLOAKING, CLSCTX_APPCONTAINER, CLSCTX_ACTIVATE_AAA_AS_IU, CLSCTX_RESERVED6,
|
||
// CLSCTX_ACTIVATE_ARM32_SERVER, CLSCTX_PS_DLL } CLSCTX;
|
||
[PInvokeData("wtypesbase.h", MSDNShortId = "dcb82ff2-56e4-4c7e-a621-7ffd0f1a9d8e")]
|
||
[Flags]
|
||
public enum CLSCTX : uint
|
||
{
|
||
/// <summary>
|
||
/// The code that creates and manages objects of this class is a DLL that runs in the same process as the caller of the function
|
||
/// specifying the class context.
|
||
/// </summary>
|
||
CLSCTX_INPROC_SERVER = 0x00000001,
|
||
|
||
/// <summary>
|
||
/// The code that manages objects of this class is an in-process handler. This is a DLL that runs in the client process and
|
||
/// implements client-side structures of this class when instances of the class are accessed remotely.
|
||
/// </summary>
|
||
CLSCTX_INPROC_HANDLER = 0x00000002,
|
||
|
||
/// <summary>
|
||
/// The EXE code that creates and manages objects of this class runs on same machine but is loaded in a separate process space.
|
||
/// </summary>
|
||
CLSCTX_LOCAL_SERVER = 0x00000004,
|
||
|
||
/// <summary>Obsolete.</summary>
|
||
CLSCTX_INPROC_SERVER16 = 0x00000008,
|
||
|
||
/// <summary>
|
||
/// A remote context. The LocalServer32 or LocalService code that creates and manages objects of this class is run on a different computer.
|
||
/// </summary>
|
||
CLSCTX_REMOTE_SERVER = 0x00000010,
|
||
|
||
/// <summary>Obsolete.</summary>
|
||
CLSCTX_INPROC_HANDLER16 = 0x00000020,
|
||
|
||
/// <summary>Reserved.</summary>
|
||
CLSCTX_RESERVED1 = 0x00000040,
|
||
|
||
/// <summary>Reserved.</summary>
|
||
CLSCTX_RESERVED2 = 0x00000080,
|
||
|
||
/// <summary>Reserved.</summary>
|
||
CLSCTX_RESERVED3 = 0x00000100,
|
||
|
||
/// <summary>Reserved.</summary>
|
||
CLSCTX_RESERVED4 = 0x00000200,
|
||
|
||
/// <summary>
|
||
/// Disaables the downloading of code from the directory service or the Internet. This flag cannot be set at the same time as CLSCTX_ENABLE_CODE_DOWNLOAD.
|
||
/// </summary>
|
||
CLSCTX_NO_CODE_DOWNLOAD = 0x00000400,
|
||
|
||
/// <summary>Reserved.</summary>
|
||
CLSCTX_RESERVED5 = 0x00000800,
|
||
|
||
/// <summary>Specify if you want the activation to fail if it uses custom marshalling.</summary>
|
||
CLSCTX_NO_CUSTOM_MARSHAL = 0x00001000,
|
||
|
||
/// <summary>
|
||
/// Enables the downloading of code from the directory service or the Internet. This flag cannot be set at the same time as CLSCTX_NO_CODE_DOWNLOAD.
|
||
/// </summary>
|
||
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x00002000,
|
||
|
||
/// <summary>
|
||
/// The CLSCTX_NO_FAILURE_LOG can be used to override the logging of failures in CoCreateInstanceEx. If the
|
||
/// ActivationFailureLoggingLevel is created, the following values can determine the status of event logging:
|
||
/// </summary>
|
||
CLSCTX_NO_FAILURE_LOG = 0x00004000,
|
||
|
||
/// <summary>
|
||
/// Disables activate-as-activator (AAA) activations for this activation only. This flag overrides the setting of the
|
||
/// EOAC_DISABLE_AAA flag from the EOLE_AUTHENTICATION_CAPABILITIES enumeration. This flag cannot be set at the same time as
|
||
/// CLSCTX_ENABLE_AAA. Any activation where a server process would be launched under the caller's identity is known as an
|
||
/// activate-as-activator (AAA) activation. Disabling AAA activations allows an application that runs under a privileged account
|
||
/// (such as LocalSystem) to help prevent its identity from being used to launch untrusted components. Library applications that
|
||
/// use activation calls should always set this flag during those calls. This helps prevent the library application from being
|
||
/// used in an escalation-of-privilege security attack. This is the only way to disable AAA activations in a library application
|
||
/// because the EOAC_DISABLE_AAA flag from the EOLE_AUTHENTICATION_CAPABILITIES enumeration is applied only to the server process
|
||
/// and not to the library application. Windows 2000: This flag is not supported.
|
||
/// </summary>
|
||
CLSCTX_DISABLE_AAA = 0x00008000,
|
||
|
||
/// <summary>
|
||
/// Enables activate-as-activator (AAA) activations for this activation only. This flag overrides the setting of the
|
||
/// EOAC_DISABLE_AAA flag from the EOLE_AUTHENTICATION_CAPABILITIES enumeration. This flag cannot be set at the same time as
|
||
/// CLSCTX_DISABLE_AAA. Any activation where a server process would be launched under the caller's identity is known as an
|
||
/// activate-as-activator (AAA) activation. Enabling this flag allows an application to transfer its identity to an activated
|
||
/// component. Windows 2000: This flag is not supported.
|
||
/// </summary>
|
||
CLSCTX_ENABLE_AAA = 0x00010000,
|
||
|
||
/// <summary>Begin this activation from the default context of the current apartment.</summary>
|
||
CLSCTX_FROM_DEFAULT_CONTEXT = 0x00020000,
|
||
|
||
/// <summary/>
|
||
CLSCTX_ACTIVATE_X86_SERVER = 0x00040000,
|
||
|
||
/// <summary>Activate or connect to a 32-bit version of the server; fail if one is not registered.</summary>
|
||
CLSCTX_ACTIVATE_32_BIT_SERVER = CLSCTX_ACTIVATE_X86_SERVER,
|
||
|
||
/// <summary>Activate or connect to a 64 bit version of the server; fail if one is not registered.</summary>
|
||
CLSCTX_ACTIVATE_64_BIT_SERVER = 0x00080000,
|
||
|
||
/// <summary>
|
||
/// When this flag is specified, COM uses the impersonation token of the thread, if one is present, for the activation request
|
||
/// made by the thread. When this flag is not specified or if the thread does not have an impersonation token, COM uses the
|
||
/// process token of the thread's process for the activation request made by the thread. Windows Vista or later: This flag is supported.
|
||
/// </summary>
|
||
CLSCTX_ENABLE_CLOAKING = 0x00100000,
|
||
|
||
/// <summary/>
|
||
CLSCTX_APPCONTAINER = 0x400000,
|
||
|
||
/// <summary/>
|
||
CLSCTX_ACTIVATE_AAA_AS_IU = 0x800000,
|
||
|
||
/// <summary/>
|
||
CLSCTX_RESERVED6 = 0x1000000,
|
||
|
||
/// <summary/>
|
||
CLSCTX_ACTIVATE_ARM32_SERVER = 0x2000000,
|
||
|
||
/// <summary>Used for loading Proxy/Stub DLLs.</summary>
|
||
CLSCTX_PS_DLL = 0x80000000,
|
||
|
||
/// <summary>Combination of CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER.</summary>
|
||
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
|
||
|
||
/// <summary>Combination of CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER.</summary>
|
||
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
|
||
|
||
/// <summary>Combination of CLSCTX_SERVER | CLSCTX_INPROC_HANDLER.</summary>
|
||
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER,
|
||
}
|
||
|
||
/// <summary>
|
||
/// Determines the concurrency model used for incoming calls to objects created by this thread. This concurrency model can be either
|
||
/// apartment-threaded or multithreaded.
|
||
/// </summary>
|
||
[Flags]
|
||
[PInvokeData("Objbase.h", MSDNShortId = "ms678505")]
|
||
public enum COINIT
|
||
{
|
||
/// <summary>Initializes the thread for apartment-threaded object concurrency (see Remarks).</summary>
|
||
COINIT_APARTMENTTHREADED = 0x2,
|
||
|
||
/// <summary>Initializes the thread for multithreaded object concurrency (see Remarks).</summary>
|
||
COINIT_MULTITHREADED = 0x0,
|
||
|
||
/// <summary>Disables DDE for OLE1 support.</summary>
|
||
COINIT_DISABLE_OLE1DDE = 0x4,
|
||
|
||
/// <summary>Increase memory usage in an attempt to increase performance.</summary>
|
||
COINIT_SPEED_OVER_MEMORY = 0x8
|
||
}
|
||
|
||
/// <summary>Determines the type of COM security descriptor to get when calling CoGetSystemSecurityPermissions.</summary>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/ne-objbase-comsd typedef enum tagCOMSD { SD_LAUNCHPERMISSIONS,
|
||
// SD_ACCESSPERMISSIONS, SD_LAUNCHRESTRICTIONS, SD_ACCESSRESTRICTIONS } COMSD;
|
||
[PInvokeData("objbase.h", MSDNShortId = "FF783F27-D5EF-4927-9B7D-489271FBA9B3")]
|
||
public enum COMSD
|
||
{
|
||
/// <summary>Machine-wide launch permissions.</summary>
|
||
SD_LAUNCHPERMISSIONS,
|
||
|
||
/// <summary>Machine-wide access permissions.</summary>
|
||
SD_ACCESSPERMISSIONS,
|
||
|
||
/// <summary>Machine-wide launch limits.</summary>
|
||
SD_LAUNCHRESTRICTIONS,
|
||
|
||
/// <summary>Machine-wide access limits.</summary>
|
||
SD_ACCESSRESTRICTIONS,
|
||
}
|
||
|
||
/// <summary>
|
||
/// The STGFMT enumeration values specify the format of a storage object and are used in the StgCreateStorageEx and StgOpenStorageEx
|
||
/// functions in the stgfmt parameter. This value, in combination with the value in the riid parameter, is used to determine the file
|
||
/// format and the interface implementation to use.
|
||
/// </summary>
|
||
[PInvokeData("Objbase.h", MSDNShortId = "aa380330")]
|
||
public enum STGFMT
|
||
{
|
||
/// <summary>Indicates that the file must be a compound file.</summary>
|
||
STGFMT_STORAGE = 0,
|
||
|
||
/// <summary>Undocumented.</summary>
|
||
STGFMT_NATIVE = 1,
|
||
|
||
/// <summary>
|
||
/// Indicates that the file must not be a compound file. This element is only valid when using the StgCreateStorageEx or
|
||
/// StgOpenStorageEx functions to access the NTFS file system implementation of the IPropertySetStorage interface. Therefore,
|
||
/// these functions return an error if the riid parameter does not specify the IPropertySetStorage interface, or if the specified
|
||
/// file is not located on an NTFS file system volume.
|
||
/// </summary>
|
||
STGFMT_FILE = 3,
|
||
|
||
/// <summary>
|
||
/// Indicates that the system will determine the file type and use the appropriate structured storage or property set
|
||
/// implementation. This value cannot be used with the StgCreateStorageEx function.
|
||
/// </summary>
|
||
STGFMT_ANY = 4,
|
||
|
||
/// <summary>
|
||
/// Indicates that the file must be a compound file, and is similar to the STGFMT_STORAGE flag, but indicates that the
|
||
/// compound-file form of the compound-file implementation must be used. For more information, see Compound File Implementation Limits.
|
||
/// </summary>
|
||
STGFMT_DOCFILE = 5
|
||
}
|
||
|
||
/// <summary>
|
||
/// Locates an object by means of its moniker, activates the object if it is inactive, and retrieves a pointer to the specified
|
||
/// interface on that object.
|
||
/// </summary>
|
||
/// <param name="pmk">A pointer to the object's moniker. See IMoniker.</param>
|
||
/// <param name="grfOpt">This parameter is reserved for future use and must be 0.</param>
|
||
/// <param name="iidResult">The interface identifier to be used to communicate with the object.</param>
|
||
/// <param name="ppvResult">
|
||
/// The address of pointer variable that receives the interface pointer requested in iidResult. Upon successful return, *ppvResult
|
||
/// contains the requested interface pointer. If an error occurs, *ppvResult is <c>NULL</c>. If the call is successful, the caller is
|
||
/// responsible for releasing the pointer with a call to the object's IUnknown::Release method.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>
|
||
/// This function can return the following error codes, or any of the error values returned by the IMoniker::BindToObject method.
|
||
/// </para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The object was located and activated, if necessary, and a pointer to the requested interface was returned.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_NOOBJECT</term>
|
||
/// <term>The object that the moniker object identified could not be found.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>BindMoniker</c> is a helper function supplied as a convenient way for a client that has the moniker of an object to obtain a
|
||
/// pointer to one of that object's interfaces. <c>BindMoniker</c> packages the following calls:
|
||
/// </para>
|
||
/// <para>
|
||
/// CreateBindCtx creates a bind context object that supports the system implementation of IBindContext. The pmk parameter is
|
||
/// actually a pointer to the IMoniker implementation on a moniker object. This implementation's BindToObject method supplies the
|
||
/// pointer to the requested interface pointer.
|
||
/// </para>
|
||
/// <para>
|
||
/// If you have several monikers to bind in quick succession and if you know that those monikers will activate the same object, it
|
||
/// may be more efficient to call the IMoniker::BindToObject method directly, which enables you to use the same bind context object
|
||
/// for all the monikers. See the IBindCtx interface for more information.
|
||
/// </para>
|
||
/// <para>
|
||
/// Container applications that allow their documents to contain linked objects are a special client that generally does not make
|
||
/// direct calls to IMoniker methods. Instead, the client manipulates the linked objects through the IOleLink interface. The default
|
||
/// handler implements this interface and calls the appropriate <c>IMoniker</c> methods as needed.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-bindmoniker HRESULT BindMoniker( LPMONIKER pmk, DWORD
|
||
// grfOpt, REFIID iidResult, LPVOID *ppvResult );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "5a022c39-fc2c-458b-9dfe-fed1255d49a4")]
|
||
public static extern HRESULT BindMoniker(IMoniker pmk, [Optional] uint grfOpt, in Guid iidResult, [MarshalAs(UnmanagedType.IUnknown)] out object ppvResult);
|
||
|
||
/// <summary>
|
||
/// This function passes the foreground privilege (the privilege to set the foreground window) from one process to another. The
|
||
/// process that has the foreground privilege can call this function to pass that privilege on to a local COM server process. Note
|
||
/// that calling <c>CoAllowSetForegroundWindow</c> only confers the privilege; it does not set the foreground window itself.
|
||
/// Foreground and focus are only taken away from the client application when the target COM server calls either SetForegroundWindow
|
||
/// or another API that does so indirectly.
|
||
/// </summary>
|
||
/// <param name="pUnk">A pointer to the IUnknown interface on the proxy of the target COM server.</param>
|
||
/// <param name="lpvReserved">This parameter is reserved and must be <c>NULL</c>.</param>
|
||
/// <returns>
|
||
/// <para>This function can return the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The method was successful.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_INVALIDARG</term>
|
||
/// <term>The lpvReserved parameter is not NULL.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_NOINTERFACE</term>
|
||
/// <term>The pUnk parameter does not support foreground window control.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_ACCESSDENIED</term>
|
||
/// <term>The calling process does not currently possess the foreground privilege.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The system restricts which processes can call the SetForegroundWindow and AllowSetForegroundWindow functions to set the
|
||
/// foreground window. As a result, an application is blocked from stealing the focus from another application even when the user is
|
||
/// interacting with it. Use <c>CoAllowSetForegroundWindow</c> to pass on the foreground privilege from a process that has it to a
|
||
/// process that does not yet have it. This can be done transitively: passing the privilege from one process to another, and then to
|
||
/// another, and so on.
|
||
/// </para>
|
||
/// <para>
|
||
/// <c>CoAllowSetForegroundWindow</c> enables a user that has a custom interface to get the same behavior that happens for OLE
|
||
/// interfaces where a change of window is expected (primarily associated with linking and embedding).
|
||
/// </para>
|
||
/// <para>
|
||
/// Behind the scenes, the IForegroundTransfer interface is used to yield the foreground window between processes. A standard
|
||
/// COM-provided proxy already implements <c>IForegroundTransfer</c>, so you don't have to do any extra work if you're using a
|
||
/// standard proxy. Just call <c>CoAllowSetForegroundWindow</c> to transfer the foreground privilege to any out-of-process COM object.
|
||
/// </para>
|
||
/// <para>Examples</para>
|
||
/// <para>
|
||
/// The following example demonstrates how a client process can create a local COM server, call <c>CoAllowSetForegroundWindow</c> to
|
||
/// transfer the foreground privilege, and then call a function on the COM server that in turn directly or indirectly calls SetForegroundWindow.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coallowsetforegroundwindow HRESULT
|
||
// CoAllowSetForegroundWindow( IUnknown *pUnk, LPVOID lpvReserved );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "a728aaad-3d7a-425c-b886-ba35c4fa54d0")]
|
||
public static extern HRESULT CoAllowSetForegroundWindow([MarshalAs(UnmanagedType.IUnknown)] object pUnk, IntPtr lpvReserved = default);
|
||
|
||
/// <summary>
|
||
/// <para>Converts the MS-DOS representation of the time and date to a FILETIME structure used by Windows.</para>
|
||
/// <para><c>Note</c> This function is provided for compatibility with 16-bit Windows.</para>
|
||
/// </summary>
|
||
/// <param name="nDosDate">The MS-DOS date.</param>
|
||
/// <param name="nDosTime">The MS-DOS time.</param>
|
||
/// <param name="lpFileTime">A pointer to the FILETIME structure.</param>
|
||
/// <returns>
|
||
/// If the function succeeds, the return value is <c>TRUE</c>; otherwise, it is <c>FALSE</c>, probably because of invalid arguments.
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>An MS-DOS date has the following format.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Bits</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>0-4</term>
|
||
/// <term>Days of the month (1-31).</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>5-8</term>
|
||
/// <term>Months (1 = January, 2 = February, and so forth).</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>9-15</term>
|
||
/// <term>Year offset from 1980 (add 1980 to get actual year).</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para>An MS-DOS time has the following format.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Bits</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>0-4</term>
|
||
/// <term>Seconds divided by 2.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>5-10</term>
|
||
/// <term>Minutes (0-59).</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>11-15</term>
|
||
/// <term>Hours (0-23 on a 24-hour clock).</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-codosdatetimetofiletime BOOL CoDosDateTimeToFileTime( WORD
|
||
// nDosDate, WORD nDosTime, FILETIME *lpFileTime );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "eb7af6a3-7547-405e-b96e-3e68a1ac273b")]
|
||
[return: MarshalAs(UnmanagedType.Bool)]
|
||
public static extern bool CoDosDateTimeToFileTime(ushort nDosDate, ushort nDosTime, out FILETIME lpFileTime);
|
||
|
||
/// <summary>
|
||
/// <para>Converts a FILETIME into MS-DOS date and time values.</para>
|
||
/// <para><c>Note</c> This function is provided for compatibility with 16-bit Windows.</para>
|
||
/// </summary>
|
||
/// <param name="lpFileTime">A pointer to the FILETIME structure.</param>
|
||
/// <param name="lpDosDate">Receives the MS-DOS date.</param>
|
||
/// <param name="lpDosTime">Receives the MS-DOS time.</param>
|
||
/// <returns>If the function succeeds, the return value is <c>TRUE</c>; otherwise, it is <c>FALSE</c>.</returns>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cofiletimetodosdatetime BOOL CoFileTimeToDosDateTime(
|
||
// FILETIME *lpFileTime, LPWORD lpDosDate, LPWORD lpDosTime );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "38670fe7-10cf-44e2-a5f1-60ec43fd83b5")]
|
||
[return: MarshalAs(UnmanagedType.Bool)]
|
||
public static extern bool CoFileTimeToDosDateTime(in FILETIME lpFileTime, out ushort lpDosDate, out ushort lpDosTime);
|
||
|
||
/// <summary>
|
||
/// Frees all the DLLs that have been loaded with the CoLoadLibrary function (called internally by CoGetClassObject), regardless of
|
||
/// whether they are currently in use.
|
||
/// </summary>
|
||
/// <returns>This function does not return a value.</returns>
|
||
/// <remarks>
|
||
/// To unload libraries, <c>CoFreeAllLibraries</c> uses a list of loaded DLLs for each process that the COM library maintains. The
|
||
/// CoUninitialize and OleUninitialize functions call <c>CoFreeAllLibraries</c> internally, so applications usually have no need to
|
||
/// call this function directly.
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cofreealllibraries void CoFreeAllLibraries( );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "20616c05-21c6-4895-a1b5-4bae1aa417c7")]
|
||
public static extern void CoFreeAllLibraries();
|
||
|
||
/// <summary>
|
||
/// <para>Frees a library that, when loaded, was specified to be freed explicitly.</para>
|
||
/// <para><c>Note</c> This function is provided for compatibility with 16-bit Windows.</para>
|
||
/// </summary>
|
||
/// <param name="hInst">A handle to the library module to be freed, as returned by the CoLoadLibrary function.</param>
|
||
/// <returns>This function does not return a value.</returns>
|
||
/// <remarks>
|
||
/// The <c>CoFreeLibrary</c> function should be called to free a library that is to be freed explicitly. This is established when the
|
||
/// library is loaded with the bAutoFree parameter of CoLoadLibrary set to <c>FALSE</c>. It is illegal to free a library explicitly
|
||
/// when the corresponding <c>CoLoadLibrary</c> call specifies that it be freed automatically (the bAutoFree parameter is set to <c>TRUE</c>).
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cofreelibrary void CoFreeLibrary( HINSTANCE hInst );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "3959e7d9-6220-474e-8f85-76f7f935727f")]
|
||
public static extern void CoFreeLibrary(HINSTANCE hInst);
|
||
|
||
/// <summary>Creates a new object and initializes it from a file using IPersistFile::Load.</summary>
|
||
/// <param name="pServerInfo">
|
||
/// A pointer to a COSERVERINFO structure that specifies the computer on which to instantiate the object and the authentication
|
||
/// setting to be used. This parameter can be <c>NULL</c>, in which case the object is instantiated on the current computer, at the
|
||
/// computer specified under the RemoteServerName registry value for the class, or at the computer where the pwszName file resides if
|
||
/// the ActivateAtStorage value is specified for the class or there is no local registry information.
|
||
/// </param>
|
||
/// <param name="pClsid">
|
||
/// A pointer to the class identifier of the object to be created. This parameter can be <c>NULL</c>, in which case there is a call
|
||
/// to GetClassFile, using pwszName as its parameter to get the class of the object to be instantiated.
|
||
/// </param>
|
||
/// <param name="punkOuter">
|
||
/// When non- <c>NULL</c>, indicates the instance is being created as part of an aggregate, and punkOuter is to be used as the
|
||
/// pointer to the new instance's controlling IUnknown. Aggregation is not supported cross-process or cross-computer. When
|
||
/// instantiating an object out of process, CLASS_E_NOAGGREGATION will be returned if punkOuter is non- <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="dwClsCtx">Values from the CLSCTX enumeration.</param>
|
||
/// <param name="grfMode">Specifies how the file is to be opened. See STGM Constants.</param>
|
||
/// <param name="pwszName">The file used to initialize the object with IPersistFile::Load. This parameter cannot be <c>NULL</c>.</param>
|
||
/// <param name="dwCount">The number of structures in pResults. This parameter must be greater than 0.</param>
|
||
/// <param name="pResults">
|
||
/// An array of MULTI_QI structures. Each structure has three members: the identifier for a requested interface ( <c>pIID</c>), the
|
||
/// location to return the interface pointer ( <c>pItf</c>) and the return value of the call to QueryInterface ( <c>hr</c>).
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_INVALIDARG, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The function retrieved all of the interfaces successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>CO_S_NOTALLINTERFACES</term>
|
||
/// <term>
|
||
/// At least one, but not all of the interfaces requested in the pResults array were successfully retrieved. The hr member of each of
|
||
/// the MULTI_QI structures indicates with S_OK or E_NOINTERFACE whether the specific interface was returned.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_NOINTERFACE</term>
|
||
/// <term>None of the interfaces requested in the pResults array were successfully retrieved.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>CoGetInstanceFromFile</c> creates a new object and initializes it from a file using IPersistFile::Load. The result of this
|
||
/// function is similar to creating an instance with a call to CoCreateInstanceEx, followed by an initializing call to
|
||
/// <c>IPersistFile::Load</c>, with the following important distinctions:
|
||
/// </para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>Fewer network round trips are required by this function when instantiating an object on a remote computer.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// In the case where dwClsCtx is set to CLSCTX_REMOTE_SERVER and pServerInfo is <c>NULL</c>, if the class is registered with the
|
||
/// ActivateAtStorage sub-key or has no associated registry information, this function will instantiate an object on the computer
|
||
/// where pwszName resides, providing the least possible network traffic.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cogetinstancefromfile HRESULT CoGetInstanceFromFile(
|
||
// COSERVERINFO *pServerInfo, CLSID *pClsid, IUnknown *punkOuter, DWORD dwClsCtx, DWORD grfMode, OLECHAR *pwszName, DWORD dwCount,
|
||
// MULTI_QI *pResults );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "f8a22f5f-a21f-49e7-bd6c-ca987206ee46")]
|
||
public static extern HRESULT CoGetInstanceFromFile([Optional] COSERVERINFO pServerInfo, in Guid pClsid, [MarshalAs(UnmanagedType.IUnknown), Optional] object punkOuter, CLSCTX dwClsCtx, STGM grfMode, [MarshalAs(UnmanagedType.LPWStr)] string pwszName, uint dwCount, [In, Out] MULTI_QI[] pResults);
|
||
|
||
/// <summary>Creates a new object and initializes it from a file using IPersistFile::Load.</summary>
|
||
/// <param name="pServerInfo">
|
||
/// A pointer to a COSERVERINFO structure that specifies the computer on which to instantiate the object and the authentication
|
||
/// setting to be used. This parameter can be <c>NULL</c>, in which case the object is instantiated on the current computer, at the
|
||
/// computer specified under the RemoteServerName registry value for the class, or at the computer where the pwszName file resides if
|
||
/// the ActivateAtStorage value is specified for the class or there is no local registry information.
|
||
/// </param>
|
||
/// <param name="pClsid">
|
||
/// A pointer to the class identifier of the object to be created. This parameter can be <c>NULL</c>, in which case there is a call
|
||
/// to GetClassFile, using pwszName as its parameter to get the class of the object to be instantiated.
|
||
/// </param>
|
||
/// <param name="punkOuter">
|
||
/// When non- <c>NULL</c>, indicates the instance is being created as part of an aggregate, and punkOuter is to be used as the
|
||
/// pointer to the new instance's controlling IUnknown. Aggregation is not supported cross-process or cross-computer. When
|
||
/// instantiating an object out of process, CLASS_E_NOAGGREGATION will be returned if punkOuter is non- <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="dwClsCtx">Values from the CLSCTX enumeration.</param>
|
||
/// <param name="grfMode">Specifies how the file is to be opened. See STGM Constants.</param>
|
||
/// <param name="pwszName">The file used to initialize the object with IPersistFile::Load. This parameter cannot be <c>NULL</c>.</param>
|
||
/// <param name="dwCount">The number of structures in pResults. This parameter must be greater than 0.</param>
|
||
/// <param name="pResults">
|
||
/// An array of MULTI_QI structures. Each structure has three members: the identifier for a requested interface ( <c>pIID</c>), the
|
||
/// location to return the interface pointer ( <c>pItf</c>) and the return value of the call to QueryInterface ( <c>hr</c>).
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_INVALIDARG, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The function retrieved all of the interfaces successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>CO_S_NOTALLINTERFACES</term>
|
||
/// <term>
|
||
/// At least one, but not all of the interfaces requested in the pResults array were successfully retrieved. The hr member of each of
|
||
/// the MULTI_QI structures indicates with S_OK or E_NOINTERFACE whether the specific interface was returned.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_NOINTERFACE</term>
|
||
/// <term>None of the interfaces requested in the pResults array were successfully retrieved.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>CoGetInstanceFromFile</c> creates a new object and initializes it from a file using IPersistFile::Load. The result of this
|
||
/// function is similar to creating an instance with a call to CoCreateInstanceEx, followed by an initializing call to
|
||
/// <c>IPersistFile::Load</c>, with the following important distinctions:
|
||
/// </para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>Fewer network round trips are required by this function when instantiating an object on a remote computer.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// In the case where dwClsCtx is set to CLSCTX_REMOTE_SERVER and pServerInfo is <c>NULL</c>, if the class is registered with the
|
||
/// ActivateAtStorage sub-key or has no associated registry information, this function will instantiate an object on the computer
|
||
/// where pwszName resides, providing the least possible network traffic.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cogetinstancefromfile HRESULT CoGetInstanceFromFile(
|
||
// COSERVERINFO *pServerInfo, CLSID *pClsid, IUnknown *punkOuter, DWORD dwClsCtx, DWORD grfMode, OLECHAR *pwszName, DWORD dwCount,
|
||
// MULTI_QI *pResults );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "f8a22f5f-a21f-49e7-bd6c-ca987206ee46")]
|
||
public static extern HRESULT CoGetInstanceFromFile([Optional] COSERVERINFO pServerInfo, [Optional] IntPtr pClsid, [MarshalAs(UnmanagedType.IUnknown), Optional] object punkOuter, CLSCTX dwClsCtx, STGM grfMode, [MarshalAs(UnmanagedType.LPWStr)] string pwszName, uint dwCount, [In, Out] MULTI_QI[] pResults);
|
||
|
||
/// <summary>Creates a new object and initializes it from a storage object through an internal call to IPersistFile::Load.</summary>
|
||
/// <param name="pServerInfo">
|
||
/// A pointer to a COSERVERINFO structure that specifies the computer on which to instantiate the object and the authentication
|
||
/// setting to be used. This parameter can be <c>NULL</c>, in which case the object is instantiated on the current computer, at the
|
||
/// computer specified under the RemoteServerName registry value for the class, or at the computer where the pstg storage object
|
||
/// resides if the ActivateAtStorage value is specified for the class or there is no local registry information.
|
||
/// </param>
|
||
/// <param name="pClsid">
|
||
/// A pointer to the class identifier of the object to be created. This parameter can be <c>NULL</c>, in which case there is a call
|
||
/// to IStorage::Stat to find the class of the object.
|
||
/// </param>
|
||
/// <param name="punkOuter">
|
||
/// When non- <c>NULL</c>, indicates the instance is being created as part of an aggregate, and punkOuter is to be used as the
|
||
/// pointer to the new instance's controlling IUnknown. Aggregation is not supported cross-process or cross-computer. When
|
||
/// instantiating an object out of process, CLASS_E_NOAGGREGATION will be returned if punkOuter is non- <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="dwClsCtx">Values from the CLSCTX enumeration.</param>
|
||
/// <param name="pstg">
|
||
/// A pointer to the storage object used to initialize the object with IPersistFile::Load. This parameter cannot be <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="dwCount">The number of structures in pResults. This parameter must be greater than 0.</param>
|
||
/// <param name="pResults">
|
||
/// An array of MULTI_QI structures. Each structure has three members: the identifier for a requested interface ( <c>pIID</c>), the
|
||
/// location to return the interface pointer ( <c>pItf</c>) and the return value of the call to QueryInterface ( <c>hr</c>).
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_INVALIDARG, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The function retrieved all of the interfaces successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>CO_S_NOTALLINTERFACES</term>
|
||
/// <term>
|
||
/// At least one, but not all of the interfaces requested in the pResults array were successfully retrieved. The hr member of each of
|
||
/// the MULTI_QI structures indicates with S_OK or E_NOINTERFACE whether the specific interface was returned.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_NOINTERFACE</term>
|
||
/// <term>None of the interfaces requested in the pResults array were successfully retrieved.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>CoGetInstanceFromIStorage</c> creates a new object and initializes it from a storage object using IPersistFile::Load. The
|
||
/// result of this function is similar to creating an instance with a call to CoCreateInstanceEx, followed by an initializing call to
|
||
/// <c>IPersistFile::Load</c>, with the following important distinctions:
|
||
/// </para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>Fewer network round trips are required by this function when instantiating an object on a remote computer.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// In the case where dwClsCtx is set to CLSCTX_REMOTE_SERVER and pServerInfo is <c>NULL</c>, if the class is registered with the
|
||
/// ActivateAtStorage value or has no associated registry information, this function will instantiate an object on the computer where
|
||
/// pstg resides, providing the least possible network traffic.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cogetinstancefromistorage HRESULT CoGetInstanceFromIStorage(
|
||
// COSERVERINFO *pServerInfo, CLSID *pClsid, IUnknown *punkOuter, DWORD dwClsCtx, IStorage *pstg, DWORD dwCount, MULTI_QI *pResults );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "6a77770c-b7e1-4d29-9c4b-331b5950a635")]
|
||
public static extern HRESULT CoGetInstanceFromIStorage([Optional] COSERVERINFO pServerInfo, in Guid pClsid, [MarshalAs(UnmanagedType.IUnknown), Optional] object punkOuter, CLSCTX dwClsCtx, IStorage pstg, uint dwCount, [In, Out] MULTI_QI[] pResults);
|
||
|
||
/// <summary>Creates a new object and initializes it from a storage object through an internal call to IPersistFile::Load.</summary>
|
||
/// <param name="pServerInfo">
|
||
/// A pointer to a COSERVERINFO structure that specifies the computer on which to instantiate the object and the authentication
|
||
/// setting to be used. This parameter can be <c>NULL</c>, in which case the object is instantiated on the current computer, at the
|
||
/// computer specified under the RemoteServerName registry value for the class, or at the computer where the pstg storage object
|
||
/// resides if the ActivateAtStorage value is specified for the class or there is no local registry information.
|
||
/// </param>
|
||
/// <param name="pClsid">
|
||
/// A pointer to the class identifier of the object to be created. This parameter can be <c>NULL</c>, in which case there is a call
|
||
/// to IStorage::Stat to find the class of the object.
|
||
/// </param>
|
||
/// <param name="punkOuter">
|
||
/// When non- <c>NULL</c>, indicates the instance is being created as part of an aggregate, and punkOuter is to be used as the
|
||
/// pointer to the new instance's controlling IUnknown. Aggregation is not supported cross-process or cross-computer. When
|
||
/// instantiating an object out of process, CLASS_E_NOAGGREGATION will be returned if punkOuter is non- <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="dwClsCtx">Values from the CLSCTX enumeration.</param>
|
||
/// <param name="pstg">
|
||
/// A pointer to the storage object used to initialize the object with IPersistFile::Load. This parameter cannot be <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="dwCount">The number of structures in pResults. This parameter must be greater than 0.</param>
|
||
/// <param name="pResults">
|
||
/// An array of MULTI_QI structures. Each structure has three members: the identifier for a requested interface ( <c>pIID</c>), the
|
||
/// location to return the interface pointer ( <c>pItf</c>) and the return value of the call to QueryInterface ( <c>hr</c>).
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_INVALIDARG, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The function retrieved all of the interfaces successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>CO_S_NOTALLINTERFACES</term>
|
||
/// <term>
|
||
/// At least one, but not all of the interfaces requested in the pResults array were successfully retrieved. The hr member of each of
|
||
/// the MULTI_QI structures indicates with S_OK or E_NOINTERFACE whether the specific interface was returned.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_NOINTERFACE</term>
|
||
/// <term>None of the interfaces requested in the pResults array were successfully retrieved.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>CoGetInstanceFromIStorage</c> creates a new object and initializes it from a storage object using IPersistFile::Load. The
|
||
/// result of this function is similar to creating an instance with a call to CoCreateInstanceEx, followed by an initializing call to
|
||
/// <c>IPersistFile::Load</c>, with the following important distinctions:
|
||
/// </para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>Fewer network round trips are required by this function when instantiating an object on a remote computer.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// In the case where dwClsCtx is set to CLSCTX_REMOTE_SERVER and pServerInfo is <c>NULL</c>, if the class is registered with the
|
||
/// ActivateAtStorage value or has no associated registry information, this function will instantiate an object on the computer where
|
||
/// pstg resides, providing the least possible network traffic.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cogetinstancefromistorage HRESULT CoGetInstanceFromIStorage(
|
||
// COSERVERINFO *pServerInfo, CLSID *pClsid, IUnknown *punkOuter, DWORD dwClsCtx, IStorage *pstg, DWORD dwCount, MULTI_QI *pResults );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "6a77770c-b7e1-4d29-9c4b-331b5950a635")]
|
||
public static extern HRESULT CoGetInstanceFromIStorage([Optional] COSERVERINFO pServerInfo, [Optional] IntPtr pClsid, [MarshalAs(UnmanagedType.IUnknown), Optional] object punkOuter, CLSCTX dwClsCtx, IStorage pstg, uint dwCount, [In, Out] MULTI_QI[] pResults);
|
||
|
||
/// <summary>
|
||
/// Converts a display name into a moniker that identifies the object named, and then binds to the object identified by the moniker.
|
||
/// </summary>
|
||
/// <param name="pszName">The display name of the object to be created.</param>
|
||
/// <param name="pBindOptions">
|
||
/// The binding options used to create a moniker that creates the actual object. For details, see BIND_OPTS. This parameter can be <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="riid">A reference to the identifier of an interface that is implemented on the object to be created.</param>
|
||
/// <param name="ppv">The address of a pointer to the interface specified by riid on the object that is created.</param>
|
||
/// <returns>
|
||
/// <para>
|
||
/// This function can return the standard return values E_FAIL, E_OUTOFMEMORY, and E_UNEXPECTED, as well as the following values.
|
||
/// </para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The object was created successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_SYNTAX</term>
|
||
/// <term>The pszName parameter is not a properly formed display name.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_NOOBJECT</term>
|
||
/// <term>
|
||
/// The object identified by this moniker, or some object identified by the composite moniker of which this moniker is a part, could
|
||
/// not be found.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_EXCEEDEDDEADLINE</term>
|
||
/// <term>The binding operation could not be completed within the time limit specified by the BIND_OPTS structure passed in pBindOptions.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_CONNECTMANUALLY</term>
|
||
/// <term>
|
||
/// The binding operation requires assistance from the end user. The most common reasons for returning this value are that a password
|
||
/// is needed or that a floppy needs to be mounted.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_INTERMEDIATEINTERFACENOTSUPPORTED</term>
|
||
/// <term>
|
||
/// An intermediate object was found but it did not support an interface required to complete the binding operation. For example, an
|
||
/// item moniker returns this value if its container does not support the IOleItemContainer interface.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks><c>CoGetObject</c> encapsulates calls to the COM library functions CreateBindCtx, MkParseDisplayName, and IMoniker::BindToObject.</remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cogetobject HRESULT CoGetObject( LPCWSTR pszName, BIND_OPTS
|
||
// *pBindOptions, REFIID riid, void **ppv );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "0f5c9ef5-3918-4f93-bfd1-1017029b3dc1")]
|
||
public static extern HRESULT CoGetObject([MarshalAs(UnmanagedType.LPWStr)] string pszName, in BIND_OPTS pBindOptions, in Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);
|
||
|
||
/// <summary>
|
||
/// Converts a display name into a moniker that identifies the object named, and then binds to the object identified by the moniker.
|
||
/// </summary>
|
||
/// <param name="pszName">The display name of the object to be created.</param>
|
||
/// <param name="pBindOptions">
|
||
/// The binding options used to create a moniker that creates the actual object. For details, see BIND_OPTS. This parameter can be <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="riid">A reference to the identifier of an interface that is implemented on the object to be created.</param>
|
||
/// <param name="ppv">The address of a pointer to the interface specified by riid on the object that is created.</param>
|
||
/// <returns>
|
||
/// <para>
|
||
/// This function can return the standard return values E_FAIL, E_OUTOFMEMORY, and E_UNEXPECTED, as well as the following values.
|
||
/// </para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The object was created successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_SYNTAX</term>
|
||
/// <term>The pszName parameter is not a properly formed display name.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_NOOBJECT</term>
|
||
/// <term>
|
||
/// The object identified by this moniker, or some object identified by the composite moniker of which this moniker is a part, could
|
||
/// not be found.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_EXCEEDEDDEADLINE</term>
|
||
/// <term>The binding operation could not be completed within the time limit specified by the BIND_OPTS structure passed in pBindOptions.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_CONNECTMANUALLY</term>
|
||
/// <term>
|
||
/// The binding operation requires assistance from the end user. The most common reasons for returning this value are that a password
|
||
/// is needed or that a floppy needs to be mounted.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_INTERMEDIATEINTERFACENOTSUPPORTED</term>
|
||
/// <term>
|
||
/// An intermediate object was found but it did not support an interface required to complete the binding operation. For example, an
|
||
/// item moniker returns this value if its container does not support the IOleItemContainer interface.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks><c>CoGetObject</c> encapsulates calls to the COM library functions CreateBindCtx, MkParseDisplayName, and IMoniker::BindToObject.</remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cogetobject HRESULT CoGetObject( LPCWSTR pszName, BIND_OPTS
|
||
// *pBindOptions, REFIID riid, void **ppv );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "0f5c9ef5-3918-4f93-bfd1-1017029b3dc1")]
|
||
public static extern HRESULT CoGetObject([MarshalAs(UnmanagedType.LPWStr)] string pszName, [Optional] IntPtr pBindOptions, in Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);
|
||
|
||
/// <summary>
|
||
/// Returns the default values of the Security Descriptors of the machine-wide launch and access permissions, as well as launch and
|
||
/// access limits.
|
||
/// </summary>
|
||
/// <param name="comSDType">
|
||
/// A value from the COMSD enumeration. Specifies the type of the requested system security permissions, such as launch permissions,
|
||
/// access permissions, launch restrictions, and access restrictions.
|
||
/// </param>
|
||
/// <param name="ppSD">
|
||
/// Pointer to a caller-supplied variable that this routine sets to the address of a buffer containing the SECURITY_DESCRIPTOR for
|
||
/// the system security permissions. Memory will be allocated by <c>CoGetSystemSecurityPermissions</c> and should be freed by caller
|
||
/// with LocalFree.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return one of these values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>Success.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_INVALIDARG</term>
|
||
/// <term>Invalid parameter comSDType or ppSD.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_FAIL</term>
|
||
/// <term>No connection to the resolver process.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_OUTOFMEMORY</term>
|
||
/// <term>Not enough memory for the security descriptor's allocation.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cogetsystemsecuritypermissions HRESULT
|
||
// CoGetSystemSecurityPermissions( COMSD comSDType, PSECURITY_DESCRIPTOR *ppSD );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "8210A6A0-B861-4E85-8E5A-1BF82A01C54E")]
|
||
public static extern HRESULT CoGetSystemSecurityPermissions(COMSD comSDType, out AdvApi32.SafePSECURITY_DESCRIPTOR ppSD);
|
||
|
||
/// <summary>
|
||
/// <para>Initializes the COM library on the current thread and identifies the concurrency model as single-thread apartment (STA).</para>
|
||
/// <para>New applications should call CoInitializeEx instead of CoInitialize.</para>
|
||
/// <para>If you want to use the Windows Runtime, you must call Windows::Foundation::Initialize instead.</para>
|
||
/// </summary>
|
||
/// <param name="pvReserved">This parameter is reserved and must be <c>NULL</c>.</param>
|
||
/// <returns>
|
||
/// <para>
|
||
/// This function can return the standard return values E_INVALIDARG, E_OUTOFMEMORY, and E_UNEXPECTED, as well as the following values.
|
||
/// </para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The COM library was initialized successfully on this thread.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>S_FALSE</term>
|
||
/// <term>The COM library is already initialized on this thread.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>RPC_E_CHANGED_MODE</term>
|
||
/// <term>
|
||
/// A previous call to CoInitializeEx specified the concurrency model for this thread as multithread apartment (MTA). This could also
|
||
/// indicate that a change from neutral-threaded apartment to single-threaded apartment has occurred.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// You need to initialize the COM library on a thread before you call any of the library functions except CoGetMalloc, to get a
|
||
/// pointer to the standard allocator, and the memory allocation functions.
|
||
/// </para>
|
||
/// <para>
|
||
/// After the concurrency model for a thread is set, it cannot be changed. A call to <c>CoInitialize</c> on an apartment that was
|
||
/// previously initialized as multithreaded will fail and return RPC_E_CHANGED_MODE.
|
||
/// </para>
|
||
/// <para>
|
||
/// CoInitializeEx provides the same functionality as <c>CoInitialize</c> and also provides a parameter to explicitly specify the
|
||
/// thread's concurrency model. <c>CoInitialize</c> calls <c>CoInitializeEx</c> and specifies the concurrency model as single-thread
|
||
/// apartment. Applications developed today should call <c>CoInitializeEx</c> rather than <c>CoInitialize</c>.
|
||
/// </para>
|
||
/// <para>
|
||
/// Typically, the COM library is initialized on a thread only once. Subsequent calls to <c>CoInitialize</c> or CoInitializeEx on the
|
||
/// same thread will succeed, as long as they do not attempt to change the concurrency model, but will return S_FALSE. To close the
|
||
/// COM library gracefully, each successful call to <c>CoInitialize</c> or <c>CoInitializeEx</c>, including those that return
|
||
/// S_FALSE, must be balanced by a corresponding call to CoUninitialize. However, the first thread in the application that calls
|
||
/// <c>CoInitialize</c> with 0 (or <c>CoInitializeEx</c> with COINIT_APARTMENTTHREADED) must be the last thread to call
|
||
/// <c>CoUninitialize</c>. Otherwise, subsequent calls to <c>CoInitialize</c> on the STA will fail and the application will not work.
|
||
/// </para>
|
||
/// <para>
|
||
/// Because there is no way to control the order in which in-process servers are loaded or unloaded, do not call <c>CoInitialize</c>,
|
||
/// CoInitializeEx, or CoUninitialize from the DllMain function.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coinitialize HRESULT CoInitialize( LPVOID pvReserved );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "0f171cf4-87b9-43a6-97f2-80ed344fe376")]
|
||
public static extern HRESULT CoInitialize(IntPtr pvReserved = default);
|
||
|
||
/// <summary>
|
||
/// Initializes the COM library for use by the calling thread, sets the thread's concurrency model, and creates a new apartment for
|
||
/// the thread if one is required.
|
||
/// <para>
|
||
/// You should call Windows::Foundation::Initialize to initialize the thread instead of CoInitializeEx if you want to use the Windows
|
||
/// Runtime APIs or if you want to use both COM and Windows Runtime components. Windows::Foundation::Initialize is sufficient to use
|
||
/// for COM components.
|
||
/// </para>
|
||
/// </summary>
|
||
/// <param name="pvReserved">This parameter is reserved and must be NULL.</param>
|
||
/// <param name="coInit">
|
||
/// The concurrency model and initialization options for the thread. Values for this parameter are taken from the COINIT enumeration.
|
||
/// Any combination of values from COINIT can be used, except that the COINIT_APARTMENTTHREADED and COINIT_MULTITHREADED flags cannot
|
||
/// both be set. The default is COINIT_MULTITHREADED.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <defintion>The COM library was initialized successfully on this thread.</defintion>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>S_FALSE</term>
|
||
/// <defintion>The COM library is already initialized on this thread.</defintion>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>RPC_E_CHANGED_MODE</term>
|
||
/// <defintion>A previous call to CoInitializeEx specified the concurrency model for this thread as multithreaded apartment (MTA).
|
||
/// This could also indicate that a change from neutral-threaded apartment to single-threaded apartment has occurred.</defintion>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
[DllImport(Lib.Ole32, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = false)]
|
||
[PInvokeData("Objbase.h", MSDNShortId = "ms695279")]
|
||
public static extern HRESULT CoInitializeEx([Optional] IntPtr pvReserved, COINIT coInit);
|
||
|
||
/// <summary>Registers security and sets the default security values for the process.</summary>
|
||
/// <param name="pSecDesc">
|
||
/// The access permissions that a server will use to receive calls. This parameter is used by COM only when a server calls
|
||
/// <c>CoInitializeSecurity</c>. Its value is a pointer to one of three types: an AppID, an <c>IAccessControl</c> object, or a
|
||
/// <c>SECURITY_DESCRIPTOR</c>, in absolute format. See the Remarks section for more information.
|
||
/// </param>
|
||
/// <param name="cAuthSvc">
|
||
/// The count of entries in the asAuthSvc parameter. This parameter is used by COM only when a server calls
|
||
/// <c>CoInitializeSecurity</c>. If this parameter is 0, no authentication services will be registered and the server cannot receive
|
||
/// secure calls. A value of -1 tells COM to choose which authentication services to register, and if this is the case, the asAuthSvc
|
||
/// parameter must be <c>NULL</c>. However, Schannel will never be chosen as an authentication service by the server if this
|
||
/// parameter is -1.
|
||
/// </param>
|
||
/// <param name="asAuthSvc">
|
||
/// An array of authentication services that a server is willing to use to receive a call. This parameter is used by COM only when a
|
||
/// server calls <c>CoInitializeSecurity</c>. For more information, see <c>SOLE_AUTHENTICATION_SERVICE</c>.
|
||
/// </param>
|
||
/// <param name="pReserved1">This parameter is reserved and must be <c>NULL</c>.</param>
|
||
/// <param name="dwAuthnLevel">
|
||
/// The default authentication level for the process. Both servers and clients use this parameter when they call
|
||
/// <c>CoInitializeSecurity</c>. COM will fail calls that arrive with a lower authentication level. By default, all proxies will use
|
||
/// at least this authentication level. This value should contain one of the authentication level constants. By default, all calls to
|
||
/// <c>IUnknown</c> are made at this level.
|
||
/// </param>
|
||
/// <param name="dwImpLevel">
|
||
/// <para>
|
||
/// The default impersonation level for proxies. The value of this parameter is used only when the process is a client. It should be
|
||
/// a value from the impersonation level constants, except for RPC_C_IMP_LEVEL_DEFAULT, which is not for use with <c>CoInitializeSecurity</c>.
|
||
/// </para>
|
||
/// <para>
|
||
/// Outgoing calls from the client always use the impersonation level as specified. (It is not negotiated.) Incoming calls to the
|
||
/// client can be at any impersonation level. By default, all <c>IUnknown</c> calls are made with this impersonation level, so even
|
||
/// security-aware applications should set this level carefully. To determine which impersonation levels each authentication service
|
||
/// supports, see the description of the authentication services in COM and Security Packages. For more information about
|
||
/// impersonation levels, see Impersonation.
|
||
/// </para>
|
||
/// </param>
|
||
/// <param name="pAuthList">
|
||
/// A pointer to <c>SOLE_AUTHENTICATION_LIST</c>, which is an array of <c>SOLE_AUTHENTICATION_INFO</c> structures. This list
|
||
/// indicates the information for each authentication service that a client can use to call a server. This parameter is used by COM
|
||
/// only when a client calls <c>CoInitializeSecurity</c>.
|
||
/// </param>
|
||
/// <param name="dwCapabilities">
|
||
/// Additional capabilities of the client or server, specified by setting one or more <c>EOLE_AUTHENTICATION_CAPABILITIES</c> values.
|
||
/// Some of these value cannot be used simultaneously, and some cannot be set when particular authentication services are being used.
|
||
/// For more information about these flags, see the Remarks section.
|
||
/// </param>
|
||
/// <param name="pReserved3">This parameter is reserved and must be <c>NULL</c>.</param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_INVALIDARG, as well as the following values.</para>
|
||
/// <para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>Indicates success.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>RPC_E_TOO_LATE</term>
|
||
/// <term>CoInitializeSecurity has already been called.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>RPC_E_NO_GOOD_SECURITY_PACKAGES</term>
|
||
/// <term>
|
||
/// The asAuthSvc parameter was not NULL, and none of the authentication services in the list could be registered. Check the results
|
||
/// saved in asAuthSvc for authentication service–specific error codes.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_OUT_OF_MEMORY</term>
|
||
/// <term>Out of memory.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </para>
|
||
/// </returns>
|
||
// HRESULT CoInitializeSecurity( _In_opt_ PSECURITY_DESCRIPTOR pSecDesc, _In_ LONG cAuthSvc, _In_opt_ SOLE_AUTHENTICATION_SERVICE
|
||
// *asAuthSvc, _In_opt_ void *pReserved1, _In_ DWORD dwAuthnLevel, _In_ DWORD dwImpLevel, _In_opt_ void *pAuthList, _In_ DWORD
|
||
// dwCapabilities, _In_opt_ void *pReserved3); https://msdn.microsoft.com/en-us/library/windows/desktop/ms693736(v=vs.85).aspx
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("Objbase.h", MSDNShortId = "ms693736")]
|
||
public static extern HRESULT CoInitializeSecurity([Optional] IntPtr pSecDesc, int cAuthSvc, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] SOLE_AUTHENTICATION_SERVICE[] asAuthSvc,
|
||
[Optional] IntPtr pReserved1, RPC_C_AUTHN_LEVEL dwAuthnLevel, RPC_C_IMP_LEVEL dwImpLevel, in SOLE_AUTHENTICATION_LIST pAuthList, EOLE_AUTHENTICATION_CAPABILITIES dwCapabilities,
|
||
[Optional] IntPtr pReserved3);
|
||
|
||
/// <summary>Determines whether the specified CLSID represents an OLE 1 object.</summary>
|
||
/// <param name="rclsid">The CLSID to be checked.</param>
|
||
/// <returns>If the CLSID refers to an OLE 1 object, the return value is <c>TRUE</c>; otherwise, it is <c>FALSE</c>.</returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The <c>CoIsOle1Class</c> function determines whether an object class is from OLE 1. You can use it to prevent linking to embedded
|
||
/// OLE 1 objects within a container, which OLE 1 objects do not support. After a container has determined that copied data
|
||
/// represents an embedded object, the container code can call <c>CoIsOle1Class</c> to determine whether the embedded object is an
|
||
/// OLE 1 object. If <c>CoIsOle1Class</c> returns <c>TRUE</c>, the container does not offer CF_LINKSOURCE as one of its clipboard
|
||
/// formats. This is one of several OLE compatibility functions. The following compatibility functions, listed below, can be used to
|
||
/// convert the storage formats of objects between OLE 1 and OLE.
|
||
/// </para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>OleConvertIStorageToOLESTREAM</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>OleConvertIStorageToOLESTREAMEx</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>OleConvertOLESTREAMToIStorage</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>OleConvertOLESTREAMToIStorageEx</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coisole1class BOOL CoIsOle1Class( REFCLSID rclsid );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "3f6a021d-c8fe-40dd-9c3a-30f22ad76ce3")]
|
||
[return: MarshalAs(UnmanagedType.Bool)]
|
||
public static extern bool CoIsOle1Class(in Guid rclsid);
|
||
|
||
/// <summary>
|
||
/// <para>Loads a specific DLL into the caller's process.</para>
|
||
/// <para><c>CoLoadLibrary</c> is equivalent to LoadLibraryEx. <c>CoLoadLibrary</c> does not affect the lifetime of the library.</para>
|
||
/// </summary>
|
||
/// <param name="lpszLibName">The name of the library to be loaded.</param>
|
||
/// <param name="bAutoFree">This parameter is maintained for compatibility with 16-bit applications, but is ignored.</param>
|
||
/// <returns>If the function succeeds, the return value is a handle to the loaded library; otherwise, it is <c>NULL</c>.</returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The CoGetClassObject function does not call <c>CoLoadLibrary</c>. <c>CoLoadLibrary</c> loads a DLL specified by the lpszLibName
|
||
/// parameter into the process that called <c>CoGetClassObject</c>. Containers should not call <c>CoLoadLibrary</c> directly.
|
||
/// </para>
|
||
/// <para>
|
||
/// Internally, a reference count is kept on the loaded DLL by using <c>CoLoadLibrary</c> to increment the count and the
|
||
/// CoFreeLibrary function to decrement it.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coloadlibrary HINSTANCE CoLoadLibrary( LPOLESTR lpszLibName,
|
||
// BOOL bAutoFree );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "be0d9e82-2438-488e-88c3-68dc7ac3e16f")]
|
||
public static extern HINSTANCE CoLoadLibrary([MarshalAs(UnmanagedType.LPWStr)] string lpszLibName, [MarshalAs(UnmanagedType.Bool)] bool bAutoFree = false);
|
||
|
||
/// <summary>Registers a channel hook.</summary>
|
||
/// <param name="ExtensionUuid">The extension to register.</param>
|
||
/// <param name="pChannelHook">The channel hook to register.</param>
|
||
/// <returns>If this function succeeds, it returns <c>S_OK</c>. Otherwise, it returns an <c>HRESULT</c> error code.</returns>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coregisterchannelhook HRESULT CoRegisterChannelHook( REFGUID
|
||
// ExtensionUuid, IChannelHook *pChannelHook );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "90281427-D0A3-4556-AF41-95DE7D000320")]
|
||
public static extern HRESULT CoRegisterChannelHook(in Guid ExtensionUuid, IChannelHook pChannelHook);
|
||
|
||
/// <summary>
|
||
/// Registers an implementation of the IInitializeSpy interface. The <c>IInitializeSpy</c> interface is defied to allow developers to
|
||
/// perform initialization and cleanup on COM apartments.
|
||
/// </summary>
|
||
/// <param name="pSpy">A pointer to an instance of the IInitializeSpy implementation.</param>
|
||
/// <param name="puliCookie">The address at which to store a cookie that identifies this registration.</param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_INVALIDARG, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The object was successfully registered.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_NOINTERFACE</term>
|
||
/// <term>The object does not support IInitializeSpy.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The <c>CoRegisterInitializeSpy</c> function registers an implementation of the IInitializeSpy interface, which defines methods to
|
||
/// be called when CoInitializeEx (or CoInitialize) or CoUninitialize is invoked.
|
||
/// </para>
|
||
/// <para>
|
||
/// <c>CoRegisterInitializeSpy</c> calls QueryInterface for IID_InitializeSpy on pSpy. It stores the address of the returned
|
||
/// interface pointer in thread-specific storage that is independent of the COM initialization state for this thread. On success, it
|
||
/// stores in puliCookie a ULARGE_INTEGER cookie that represents this registration. Pass this cookie to CoRevokeInitializeSpy to
|
||
/// revoke the registration.
|
||
/// </para>
|
||
/// <para>
|
||
/// IInitializeSpy implementations must deal with nesting issues caused by calling CoInitializeEx or CoUninitialize from within a
|
||
/// notification method. Notifications occur only after the registration happens on this thread. For example, if
|
||
/// <c>CoInitializeEx</c> is called before <c>CoRegisterInitializeSpy</c>, then the PreInitialize and PostInitialize notification
|
||
/// methods will not be called.
|
||
/// </para>
|
||
/// <para>
|
||
/// Notification methods must not cause the failure of CoInitializeEx or CoUninitialize by throwing exceptions. Implementations of
|
||
/// IInitializeSpy must not propagate exceptions to code that calls <c>CoInitializeEx</c> or <c>CoUninitialize</c>.
|
||
/// </para>
|
||
/// <para>
|
||
/// It is unpredictable whether a call to <c>CoRegisterInitializeSpy</c> from within an IInitializeSpy method call will be effective
|
||
/// during the current top-level (non-nested) call to CoInitializeEx or CoUninitialize. A registered implementation of
|
||
/// <c>IInitializeSpy</c> will always be effective for future top-level calls to <c>CoInitializeEx</c> or <c>CoUninitialize</c>.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coregisterinitializespy HRESULT CoRegisterInitializeSpy(
|
||
// IInitializeSpy *pSpy, ULARGE_INTEGER *puliCookie );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "1fd5606e-0a15-429a-b656-4620b873bec5")]
|
||
public static extern HRESULT CoRegisterInitializeSpy(IInitializeSpy pSpy, out ulong puliCookie);
|
||
|
||
/// <summary>
|
||
/// Registers an implementation of the IMallocSpy interface, thereafter requiring OLE to call its wrapper methods around every call
|
||
/// to the corresponding IMalloc method.
|
||
/// </summary>
|
||
/// <param name="pMallocSpy">A pointer to an instance of the IMallocSpy implementation.</param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_INVALIDARG, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The object was successfully registered.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>CO_E_OBJISREG</term>
|
||
/// <term>The object is already registered.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The <c>CoRegisterMallocSpy</c> function registers the IMallocSpy object, which is used to debug calls to IMalloc methods. The
|
||
/// function calls QueryInterface on the pointer pMallocSpy for the interface IID_IMallocSpy. This is to ensure that pMallocSpy
|
||
/// really points to an implementation of <c>IMallocSpy</c>. By the rules of OLE, it is expected that a successful call to
|
||
/// <c>QueryInterface</c> has added a reference (through the AddRef method) to the <c>IMallocSpy</c> object. That is,
|
||
/// <c>CoRegisterMallocSpy</c> does not directly call <c>AddRef</c> on pMallocSpy, but fully expects that the <c>QueryInterface</c>
|
||
/// call will.
|
||
/// </para>
|
||
/// <para>
|
||
/// When the IMallocSpy object is registered, whenever there is a call to one of the IMalloc methods, OLE first calls the
|
||
/// corresponding <c>IMallocSpy</c> pre-method. Then, after executing the <c>IMalloc</c> method, OLE calls the corresponding
|
||
/// <c>IMallocSpy</c> post-method. For example, whenever there is a call to IMalloc::Alloc, from whatever source, OLE calls
|
||
/// IMallocSpy::PreAlloc, calls <c>Alloc</c>, and after that allocation is completed, calls IMallocSpy::PostAlloc.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coregistermallocspy HRESULT CoRegisterMallocSpy( LPMALLOCSPY
|
||
// pMallocSpy );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "28623c1f-e158-4cc5-8c7f-c13d7a65aa76")]
|
||
public static extern HRESULT CoRegisterMallocSpy(IMallocSpy pMallocSpy);
|
||
|
||
/// <summary>
|
||
/// Registers with OLE the instance of an IMessageFilter interface, which is to be used for handling concurrency issues on the
|
||
/// current thread. Only one message filter can be registered for each thread. Threads in multithreaded apartments cannot have
|
||
/// message filters.
|
||
/// </summary>
|
||
/// <param name="lpMessageFilter">
|
||
/// <para>
|
||
/// A pointer to the IMessageFilter interface on the message filter. This message filter should be registered on the current thread,
|
||
/// replacing the previous message filter (if any). This parameter can be <c>NULL</c>, indicating that no message filter should be
|
||
/// registered on the current thread.
|
||
/// </para>
|
||
/// <para>Note that this function calls AddRef on the interface pointer to the message filter.</para>
|
||
/// </param>
|
||
/// <param name="lplpMessageFilter">
|
||
/// Address of the IMessageFilter* pointer variable that receives the interface pointer to the previously registered message filter.
|
||
/// If there was no previously registered message filter for the current thread, the value of *lplpMessageFilter is <c>NULL</c>.
|
||
/// </param>
|
||
/// <returns>If the instance was registered or revoked successfully, the return value is S_OK; otherwise, it is S_FALSE.</returns>
|
||
/// <remarks>
|
||
/// To revoke the registered message filter, pass the previous message filter (possibly <c>NULL</c>) as the lpMessageFilter parameter
|
||
/// to <c>CoRegisterMessageFilter</c>.
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-coregistermessagefilter HRESULT CoRegisterMessageFilter(
|
||
// LPMESSAGEFILTER lpMessageFilter, LPMESSAGEFILTER *lplpMessageFilter );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "caa5b277-ddbd-4ba9-892d-590d953b8433")]
|
||
public static extern HRESULT CoRegisterMessageFilter(IMessageFilter lpMessageFilter, out IMessageFilter lplpMessageFilter);
|
||
|
||
/// <summary>Revokes a registered implementation of the IInitializeSpy interface.</summary>
|
||
/// <param name="uliCookie">A ULARGE_INTEGER cookie identifying the registration.</param>
|
||
/// <returns>This function can return the standard return value E_INVALIDARG, as well as S_OK to indicate success.</returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>CoRevokeInitializeSpy</c> can only revoke cookies issued by previous calls to CoRegisterInitializeSpy that were executed on
|
||
/// the current thread. Using a cookie from another thread, or one that corresponds to an already revoked registration, will return E_INVALIDARG.
|
||
/// </para>
|
||
/// <para>
|
||
/// It is unpredictable whether a call to <c>CoRevokeInitializeSpy</c> from within an IInitializeSpy method call will have an effect
|
||
/// during the current top-level (non-nested) call to CoInitializeEx or CoUninitialize. The revocation will always have an effect
|
||
/// after the current top-level call to <c>CoInitializeEx</c> or <c>CoUninitialize</c> returns.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-corevokeinitializespy HRESULT CoRevokeInitializeSpy(
|
||
// ULARGE_INTEGER uliCookie );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "24b0bedd-421a-4215-8edc-9fdce53e3b44")]
|
||
public static extern HRESULT CoRevokeInitializeSpy(ulong uliCookie);
|
||
|
||
/// <summary>Revokes a registered IMallocSpy object.</summary>
|
||
/// <returns>
|
||
/// <para>This function can return the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The object was revoked successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>CO_E_OBJNOTREG</term>
|
||
/// <term>No spy is currently registered.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_ACCESSDENIED</term>
|
||
/// <term>A spy is registered but there are outstanding allocations (not yet freed) made while this spy was active.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The IMallocSpy object is released when it is revoked. This release corresponds to the call to IUnknown::AddRef in the
|
||
/// implementation of the QueryInterface function by the CoRegisterMallocSpy function. The implementation of the <c>IMallocSpy</c>
|
||
/// interface should then do any appropriate cleanup.
|
||
/// </para>
|
||
/// <para>
|
||
/// If the return code is E_ACCESSDENIED, there are still outstanding allocations that were made while the spy was active. In this
|
||
/// case, the registered spy cannot be revoked at this time because it may have attached arbitrary headers and/or trailers to these
|
||
/// allocations that only the spy knows about. Only the spy's PreFree (or PreRealloc) method knows how to account for these headers
|
||
/// and trailers. Before returning E_ACCESSDENIED, <c>CoRevokeMallocSpy</c> notes internally that a revoke is pending. When the
|
||
/// outstanding allocations have been freed, the revoke proceeds automatically, releasing the IMallocSpy object. Thus, it is
|
||
/// necessary to call <c>CoRevokeMallocSpy</c> only once for each call to CoRegisterMallocSpy, even if E_ACCESSDENIED is returned.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-corevokemallocspy HRESULT CoRevokeMallocSpy( );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "e1e984a2-2aee-452c-840c-42201ef5ee96")]
|
||
public static extern HRESULT CoRevokeMallocSpy();
|
||
|
||
/// <summary>Establishes or removes an emulation, in which objects of one class are treated as objects of a different class.</summary>
|
||
/// <param name="clsidOld">The CLSID of the object to be emulated.</param>
|
||
/// <param name="clsidNew">
|
||
/// The CLSID of the object that should emulate the original object. This replaces any existing emulation for clsidOld. This
|
||
/// parameter can be CLSID_NULL, in which case any existing emulation for clsidOld is removed.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return values E_INVALIDARG, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The emulation was successfully established or removed.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>REGDB_E_CLASSNOTREG</term>
|
||
/// <term>The clsidOld parameter is not properly registered in the registration database.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>REGDB_E_READREGDB</term>
|
||
/// <term>Error reading from registration database.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>REGDB_E_WRITEREGDB</term>
|
||
/// <term>Error writing to registration database.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// This function sets the <c>TreatAs</c> entry in the registry for the specified object, allowing the object to be emulated by
|
||
/// another application. Emulation allows an application to open and edit an object of a different format, while retaining the
|
||
/// original format of the object. After this entry is set, whenever any function such as CoGetClassObject specifies the object's
|
||
/// original CLSID (clsidOld), it is transparently forwarded to the new CLSID (clsidNew), thus launching the application associated
|
||
/// with the <c>TreatAs</c> CLSID. When the object is saved, it can be saved in its native format, which may result in loss of edits
|
||
/// not supported by the original format.
|
||
/// </para>
|
||
/// <para>If your application supports emulation, call <c>CoTreatAsClass</c> in the following situations:</para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>
|
||
/// In response to an end-user request (through a conversion dialog box) that a specified object be treated as an object of a
|
||
/// different class (an object created under one application be run under another application, while retaining the original format information).
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>In a setup program, to register that one class of objects be treated as objects of a different class.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para>
|
||
/// An example of the first case is that an end user might wish to edit a spreadsheet created by one application using a different
|
||
/// application that can read and write the spreadsheet format of the original application. For an application that supports
|
||
/// emulation, <c>CoTreatAsClass</c> can be called to implement a <c>Treat As</c> option in a conversion dialog box.
|
||
/// </para>
|
||
/// <para>
|
||
/// An example of the use of <c>CoTreatAsClass</c> in a setup program would be in an updated version of an application. When the
|
||
/// application is updated, the objects created with the earlier version can be activated and treated as objects of the new version,
|
||
/// while retaining the previous format information. This would allow you to give the user the option to convert when they save, or
|
||
/// to save it in the previous format, possibly losing format information not available in the older version.
|
||
/// </para>
|
||
/// <para>
|
||
/// One result of setting an emulation is that when you enumerate verbs, as in the IOleObject::EnumVerbs method implementation in the
|
||
/// default handler, this would enumerate the verbs from clsidNew instead of clsidOld.
|
||
/// </para>
|
||
/// <para>
|
||
/// To ensure that existing emulation information is removed when you install an application, your setup programs should call
|
||
/// <c>CoTreatAsClass</c>, setting the clsidNew parameter to CLSID_NULL to remove any existing emulation for the classes they install.
|
||
/// </para>
|
||
/// <para>
|
||
/// If there is no CLSID assigned to the <c>AutoTreatAs</c> key in the registry, setting clsidNew and clsidOld to the same value
|
||
/// removes the <c>TreatAs</c> entry, so there is no emulation. If there is a CLSID assigned to the <c>AutoTreatAs</c> key, that
|
||
/// CLSID is assigned to the <c>TreatAs</c> key.
|
||
/// </para>
|
||
/// <para><c>CoTreatAsClass</c> does not validate whether an appropriate registry entry for clsidNew currently exists.</para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-cotreatasclass HRESULT CoTreatAsClass( REFCLSID clsidOld,
|
||
// REFCLSID clsidNew );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "d871879f-ec68-48e1-8ef6-364cf1447d0f")]
|
||
public static extern HRESULT CoTreatAsClass(in Guid clsidOld, in Guid clsidNew);
|
||
|
||
/// <summary>
|
||
/// Closes the COM library on the current thread, unloads all DLLs loaded by the thread, frees any other resources that the thread
|
||
/// maintains, and forces all RPC connections on the thread to close.
|
||
/// </summary>
|
||
[DllImport(Lib.Ole32, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = false)]
|
||
[PInvokeData("Objbase.h", MSDNShortId = "ms688715")]
|
||
public static extern void CoUninitialize();
|
||
|
||
/// <summary>Creates and returns a new anti-moniker.</summary>
|
||
/// <param name="ppmk">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the new anti-moniker. When successful, the
|
||
/// function has called AddRef on the anti-moniker and the caller is responsible for calling Release. When an error occurs, the
|
||
/// anti-moniker pointer is <c>NULL</c>.
|
||
/// </param>
|
||
/// <returns>This function can return the standard return values E_OUTOFMEMORY and S_OK.</returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// You would call this function only if you are writing your own moniker class (implementing the IMoniker interface). If you are
|
||
/// writing a new moniker class that has no internal structure, you can use <c>CreateAntiMoniker</c> in your implementation of the
|
||
/// IMoniker::Inverse method, and then check for an anti-moniker in your implementation of IMoniker::ComposeWith.
|
||
/// </para>
|
||
/// <para>
|
||
/// Like the ".." directory, which acts as the inverse to any directory name just preceding it in a path, an anti-moniker acts as the
|
||
/// inverse of a simple moniker that precedes it in a composite moniker. An anti-moniker is used as the inverse of simple monikers
|
||
/// with no internal structure. For example, the system-provided implementations of file monikers, item monikers, and pointer
|
||
/// monikers all use anti-monikers as their inverse; consequently, an anti-moniker composed to the right of one of these monikers
|
||
/// composes to nothing.
|
||
/// </para>
|
||
/// <para>
|
||
/// A moniker client (an object that is using a moniker to bind to another object) typically does not know the class of a given
|
||
/// moniker, so the client cannot be sure that an anti-moniker is the inverse. Therefore, to get the inverse of a moniker, you would
|
||
/// call IMoniker::Inverse rather than <c>CreateAntiMoniker</c>.
|
||
/// </para>
|
||
/// <para>To remove the last piece of a composite moniker, you would do the following:</para>
|
||
/// <list type="number">
|
||
/// <item>
|
||
/// <term>
|
||
/// Call IMoniker::Enum on the composite, specifying <c>FALSE</c> as the first parameter. This creates an enumerator that returns the
|
||
/// component monikers in reverse order.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>Use the enumerator to retrieve the last piece of the composite.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>Call IMoniker::Inverse on that moniker. The moniker returned by <c>Inverse</c> will remove the last piece of the composite.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-createantimoniker HRESULT CreateAntiMoniker( LPMONIKER *ppmk );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "1f8fcbd6-8f05-4d32-af8a-d8de1b56dacf")]
|
||
public static extern HRESULT CreateAntiMoniker(out IMoniker ppmk);
|
||
|
||
/// <summary>
|
||
/// Returns a pointer to an implementation of IBindCtx (a bind context object). This object stores information about a particular
|
||
/// moniker-binding operation.
|
||
/// </summary>
|
||
/// <param name="reserved">This parameter is reserved and must be 0.</param>
|
||
/// <param name="ppbc">
|
||
/// Address of an IBindCtx* pointer variable that receives the interface pointer to the new bind context object. When the function is
|
||
/// successful, the caller is responsible for calling Release on the bind context. A NULL value for the bind context indicates that
|
||
/// an error occurred.
|
||
/// </param>
|
||
/// <returns>This function can return the standard return values E_OUTOFMEMORY and S_OK.</returns>
|
||
[DllImport(Lib.Ole32, ExactSpelling = true)]
|
||
[PInvokeData("Objbase.h", MSDNShortId = "ms678542")]
|
||
public static extern HRESULT CreateBindCtx([Optional] uint reserved, out IBindCtx ppbc);
|
||
|
||
/// <summary>Creates a class moniker that refers to the specified class.</summary>
|
||
/// <param name="rclsid">A reference to the CLSID of the object type to which this moniker binds.</param>
|
||
/// <param name="ppmk">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the new class moniker. On successful return,
|
||
/// the function has called AddRef on the moniker and the caller is responsible for calling Release. When an error occurs, the value
|
||
/// of the moniker pointer is <c>NULL</c>.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The moniker has been created successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_INVALIDARG</term>
|
||
/// <term>One or more arguments are invalid.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>The class moniker will support the binding to a fresh instance of the class identified by the CLSID in rclsid.</remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-createclassmoniker HRESULT CreateClassMoniker( REFCLSID
|
||
// rclsid, LPMONIKER *ppmk );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "9361b2c1-ef26-4225-92ff-e0bef0285bc4")]
|
||
public static extern HRESULT CreateClassMoniker(in Guid rclsid, out IMoniker ppmk);
|
||
|
||
/// <summary>Retrieves a pointer to a new instance of an OLE-provided implementation of a data cache.</summary>
|
||
/// <param name="pUnkOuter">
|
||
/// If the cache is to be created as part of an aggregate, pointer to the controlling IUnknown of the aggregate. If not, the
|
||
/// parameter should be <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="rclsid">CLSID used to generate icon labels. This value is typically CLSID_NULL.</param>
|
||
/// <param name="iid">
|
||
/// Reference to the identifier of the interface the caller wants to use to communicate with the cache. This value is typically
|
||
/// IID_IOleCache (defined in the OLE headers to equal the interface identifier for IOleCache).
|
||
/// </param>
|
||
/// <param name="ppv">
|
||
/// Address of pointer variable that receives the interface pointer requested in riid. Upon successful return, *ppvObj contains the
|
||
/// requested interface pointer to the supplied cache object.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function returns S_OK on success. Other possible values include the following.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>E_NOINTERFACE</term>
|
||
/// <term>The interface represented by riid is not supported by the object. The parameter ppvObj is set to NULL.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_OUTOFMEMORY</term>
|
||
/// <term>Insufficient memory for the operation.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>E_INVALIDARG</term>
|
||
/// <term>One or more parameters are invalid.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// The cache object created by <c>CreateDataCache</c> supports the IOleCache, IOleCache2, and IOleCacheControl interfaces for
|
||
/// controlling the cache. It also supports the IPersistStorage, IDataObject (without advise sinks), IViewObject, and IViewObject2 interfaces.
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-createdatacache HRESULT CreateDataCache( LPUNKNOWN
|
||
// pUnkOuter, REFCLSID rclsid, REFIID iid, LPVOID *ppv );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "8a64675b-1337-4555-b9a6-e19f9b987ba2")]
|
||
public static extern HRESULT CreateDataCache([MarshalAs(UnmanagedType.IUnknown), Optional] object pUnkOuter, in Guid rclsid, in Guid iid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);
|
||
|
||
/// <summary>Creates a file moniker based on the specified path.</summary>
|
||
/// <param name="lpszPathName">
|
||
/// <para>The path on which this moniker is to be based.</para>
|
||
/// <para>
|
||
/// This parameter can specify a relative path, a UNC path, or a drive-letter-based path. If based on a relative path, the resulting
|
||
/// moniker must be composed onto another file moniker before it can be bound.
|
||
/// </para>
|
||
/// </param>
|
||
/// <param name="ppmk">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the new file moniker. When successful, the
|
||
/// function has called AddRef on the file moniker and the caller is responsible for calling Release. When an error occurs, the value
|
||
/// of the interface pointer is <c>NULL</c>.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_OUTOFMEMORY, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The moniker was created successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_SYNTAX</term>
|
||
/// <term>There was an error in the syntax of the path.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>CreateFileMoniker</c> creates a moniker for an object that is stored in a file. A moniker provider (an object that provides
|
||
/// monikers to other objects) can call this function to create a moniker to identify a file-based object that it controls, and can
|
||
/// then make the pointer to this moniker available to other objects. An object identified by a file moniker must also implement the
|
||
/// IPersistFile interface so it can be loaded when a file moniker is bound.
|
||
/// </para>
|
||
/// <para>
|
||
/// When each object resides in its own file, as in an OLE server application that supports linking only to file-based documents in
|
||
/// their entirety, file monikers are the only type of moniker necessary. To identify objects smaller than a file, the moniker
|
||
/// provider must use another type of moniker (such as an item moniker) in addition to file monikers, creating a composite moniker.
|
||
/// Composite monikers would be needed in an OLE server application that supports linking to objects smaller than a document (such as
|
||
/// sections of a document or embedded objects).
|
||
/// </para>
|
||
/// <para>
|
||
/// A file moniker can be composed to the right only of another file moniker when the first moniker is based on an absolute path and
|
||
/// the other is a relative path, resulting in a single file moniker based on the combination of the two paths. A moniker composed to
|
||
/// the right of another moniker must be a refinement of that moniker, and the file moniker represents the largest unit of storage.
|
||
/// To identify objects stored within a file, you would compose other types of monikers (usually item monikers) to the right of a
|
||
/// file moniker.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/desktop/api/objbase/nf-objbase-createfilemoniker HRESULT CreateFileMoniker( LPCOLESTR
|
||
// lpszPathName, LPMONIKER *ppmk );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "d9677fa0-cda0-4b63-a21f-1fd0e27c8f3f")]
|
||
public static extern HRESULT CreateFileMoniker([MarshalAs(UnmanagedType.LPWStr)] string lpszPathName, out IMoniker ppmk);
|
||
|
||
/// <summary>Performs a generic composition of two monikers and supplies a pointer to the resulting composite moniker.</summary>
|
||
/// <param name="pmkFirst">
|
||
/// A pointer to the moniker to be composed to the left of the moniker that pmkRest points to. Can point to any kind of moniker,
|
||
/// including a generic composite.
|
||
/// </param>
|
||
/// <param name="pmkRest">
|
||
/// A pointer to the moniker to be composed to the right of the moniker to which pmkFirst points. Can point to any kind of moniker
|
||
/// compatible with the type of the pmkRest moniker, including a generic composite.
|
||
/// </param>
|
||
/// <param name="ppmkComposite">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the composite moniker object that is the
|
||
/// result of composing pmkFirst and pmkRest. This object supports the OLE composite moniker implementation of <c>IMoniker</c>. When
|
||
/// successful, the function has called AddRef on the moniker and the caller is responsible for calling Release. If either pmkFirst
|
||
/// or pmkRest are <c>NULL</c>, the supplied pointer is the one that is non- <c>NULL</c>. If both pmkFirst and pmkRest are
|
||
/// <c>NULL</c>, or if an error occurs, the returned pointer is <c>NULL</c>.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_OUTOFMEMORY, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The input monikers were composed successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_SYNTAX</term>
|
||
/// <term>
|
||
/// The two monikers could not be composed due to an error in the syntax of a path (for example, if both pmkFirst and pmkRest are
|
||
/// file monikers based on absolute paths).
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// <c>CreateGenericComposite</c> joins two monikers into one. The moniker classes being joined can be different, subject only to the
|
||
/// rules of composition. Call this function only if you are writing a new moniker class by implementing the IMoniker interface,
|
||
/// within an implementation of IMoniker::ComposeWith that includes generic composition capability.
|
||
/// </para>
|
||
/// <para>
|
||
/// Moniker providers should call ComposeWith to compose two monikers together. Implementations of <c>ComposeWith</c> should (as do
|
||
/// OLE implementations) attempt, when reasonable for the class, to perform non-generic compositions first, in which two monikers of
|
||
/// the same class are combined. If this is not possible, the implementation can call <c>CreateGenericComposite</c> to do a generic
|
||
/// composition, which combines two monikers of different classes, within the rules of composition. You can define new types of
|
||
/// non-generic compositions if you write a new moniker class.
|
||
/// </para>
|
||
/// <para>
|
||
/// During the process of composing the two monikers, <c>CreateGenericComposite</c> makes all possible simplifications. Consider the
|
||
/// example where pmkFirst is the generic composite moniker, A + B + C, and pmkRest is the generic composite moniker, C -1 + B -1 + Z
|
||
/// (where C -1 is the inverse of C). The function first composes C to C -1, which composes to nothing. Then it composes B and B -1
|
||
/// to nothing. Finally, it composes A to Z, and supplies a pointer to the generic composite moniker, A + Z.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-creategenericcomposite HRESULT CreateGenericComposite(
|
||
// LPMONIKER pmkFirst, LPMONIKER pmkRest, LPMONIKER *ppmkComposite );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "7fe5b3ff-6e9b-4a28-93d3-52c76d3e8b77")]
|
||
public static extern HRESULT CreateGenericComposite(IMoniker pmkFirst, IMoniker pmkRest, out IMoniker ppmkComposite);
|
||
|
||
/// <summary>Creates an item moniker that identifies an object within a containing object (typically a compound document).</summary>
|
||
/// <param name="lpszDelim">
|
||
/// A pointer to a wide character string (two bytes per character) zero-terminated string containing the delimiter (typically "!")
|
||
/// used to separate this item's display name from the display name of its containing object.
|
||
/// </param>
|
||
/// <param name="lpszItem">
|
||
/// A pointer to a zero-terminated string indicating the containing object's name for the object being identified. This name can
|
||
/// later be used to retrieve a pointer to the object in a call to IOleItemContainer::GetObject.
|
||
/// </param>
|
||
/// <param name="ppmk">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the item moniker. When successful, the
|
||
/// function has called AddRef on the item moniker and the caller is responsible for calling Release. If an error occurs, the
|
||
/// supplied interface pointer has a <c>NULL</c> value.
|
||
/// </param>
|
||
/// <returns>This function can return the standard return values E_OUTOFMEMORY and S_OK.</returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// A moniker provider, which hands out monikers to identify its objects so they are accessible to other parties, would call
|
||
/// <c>CreateItemMoniker</c> to identify its objects with item monikers. Item monikers are based on a string, and identify objects
|
||
/// that are contained within another object and can be individually identified using a string. The containing object must also
|
||
/// implement the IOleContainer interface.
|
||
/// </para>
|
||
/// <para>
|
||
/// Most moniker providers are OLE applications that support linking. Applications that support linking to objects smaller than
|
||
/// file-based documents, such as a server application that allows linking to a selection within a document, should use item monikers
|
||
/// to identify the objects. Container applications that allow linking to embedded objects use item monikers to identify the embedded objects.
|
||
/// </para>
|
||
/// <para>
|
||
/// The lpszItem parameter is the name used by the document to uniquely identify the object. For example, if the object being
|
||
/// identified is a cell range in a spreadsheet, an appropriate name might be something like "A1:E7." An appropriate name when the
|
||
/// object being identified is an embedded object might be something like "embedobj1." The containing object must provide an
|
||
/// implementation of the IOleItemContainer interface that can interpret this name and locate the corresponding object. This allows
|
||
/// the item moniker to be bound to the object it identifies.
|
||
/// </para>
|
||
/// <para>
|
||
/// Item monikers are not used in isolation. They must be composed with a moniker that identifies the containing object as well. For
|
||
/// example, if the object being identified is a cell range contained in a file-based document, the item moniker identifying that
|
||
/// object must be composed with the file moniker identifying that document, resulting in a composite moniker that is the equivalent
|
||
/// of "C:\work\sales.xls!A1:E7."
|
||
/// </para>
|
||
/// <para>
|
||
/// Nested containers are allowed also, as in the case where an object is contained within an embedded object inside another
|
||
/// document. The complete moniker of such an object would be the equivalent of "C:\work\report.doc!embedobj1!A1:E7." In this case,
|
||
/// each containing object must call <c>CreateItemMoniker</c> and provide its own implementation of the IOleItemContainer interface.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-createitemmoniker HRESULT CreateItemMoniker( LPCOLESTR
|
||
// lpszDelim, LPCOLESTR lpszItem, LPMONIKER *ppmk );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "339919ed-660c-4239-825b-7fa96c48e5cd")]
|
||
public static extern HRESULT CreateItemMoniker([MarshalAs(UnmanagedType.LPWStr)] string lpszDelim, [MarshalAs(UnmanagedType.LPWStr)] string lpszItem, out IMoniker ppmk);
|
||
|
||
/// <summary>Creates an OBJREF moniker based on a pointer to an object.</summary>
|
||
/// <param name="punk">A pointer to the IUnknown interface on the object that the moniker is to represent.</param>
|
||
/// <param name="ppmk">Address of a pointer to the IMoniker interface on the OBJREF moniker that was created.</param>
|
||
/// <returns>This function can return the standard return values E_OUTOFMEMORY, E_UNEXPECTED, and S_OK.</returns>
|
||
/// <remarks>
|
||
/// <para>Clients use OBJREF monikers to obtain a marshaled pointer to a running object in the servers address space.</para>
|
||
/// <para>
|
||
/// The server typically calls <c>CreateObjrefMoniker</c> to create an OBJREF moniker and then calls IMoniker::GetDisplayName, and
|
||
/// finally releases the moniker. The display name for an OBJREF moniker is of the form:
|
||
/// </para>
|
||
/// <para>OBJREF:nnnnnnnn</para>
|
||
/// <para>
|
||
/// Where nnnnnnnn is an arbitrarily long base-64 encoding that encapsulates the computer location, process endpoint, and interface
|
||
/// pointer ID (IPID) of the running object
|
||
/// </para>
|
||
/// <para>
|
||
/// The display name can then be transferred to the client as text. For example, the display name can reside on an HTML page that the
|
||
/// client downloads.
|
||
/// </para>
|
||
/// <para>
|
||
/// The client can pass the display name to MkParseDisplayName, which creates an OBJREF moniker based on the display name. A call to
|
||
/// the monikers IMoniker::BindToObject method then obtains a marshaled pointer to the running instance on the server.
|
||
/// </para>
|
||
/// <para>
|
||
/// For example, a server-side COM component contained in an Active Server Page can create an OBJREF moniker, obtain its display
|
||
/// name, and write the display name to the HTML output that is sent to the client browser. A script that runs on the client side can
|
||
/// use the display name to get access to the running object itself. A client-side Visual Basic script, for instance, could store the
|
||
/// display name in a variable called strMyName and include this line:
|
||
/// </para>
|
||
/// <para>
|
||
/// The script engine internally makes the calls to MkParseDisplayName and IMoniker::BindToObject, and the script can then use
|
||
/// objMyInstance to refer directly to the running object.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-createobjrefmoniker HRESULT CreateObjrefMoniker( LPUNKNOWN
|
||
// punk, LPMONIKER *ppmk );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "0a214a11-776c-4ef6-af68-a141398f853c")]
|
||
public static extern HRESULT CreateObjrefMoniker([MarshalAs(UnmanagedType.IUnknown)] object punk, out IMoniker ppmk);
|
||
|
||
/// <summary>Creates a pointer moniker based on a pointer to an object.</summary>
|
||
/// <param name="punk">A pointer to an IUnknown interface on the object to be identified by the resulting moniker.</param>
|
||
/// <param name="ppmk">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the new pointer moniker. When successful, the
|
||
/// function has called AddRef on the moniker and the caller is responsible for calling Release. When an error occurs, the returned
|
||
/// interface pointer has a <c>NULL</c> value.
|
||
/// </param>
|
||
/// <returns>This function can return the standard return values E_OUTOFMEMORY, E_UNEXPECTED, and S_OK.</returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// A pointer moniker wraps an existing interface pointer in a moniker that can be passed to those interfaces that require monikers.
|
||
/// Pointer monikers allow an object that has no persistent representation to participate in a moniker-binding operation.
|
||
/// </para>
|
||
/// <para>Pointer monikers are not commonly used, so this function is not often called.</para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-createpointermoniker HRESULT CreatePointerMoniker( LPUNKNOWN
|
||
// punk, LPMONIKER *ppmk );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "d4d40fd5-6035-4ddc-a443-01d32dcf4bca")]
|
||
public static extern HRESULT CreatePointerMoniker([MarshalAs(UnmanagedType.IUnknown)] object punk, out IMoniker ppmk);
|
||
|
||
/// <summary>Returns the CLSID associated with the specified file name.</summary>
|
||
/// <param name="szFilename">A pointer to the filename for which you are requesting the associated CLSID.</param>
|
||
/// <param name="pclsid">A pointer to the location where the associated CLSID is written on return.</param>
|
||
/// <returns>
|
||
/// <para>This function can return any of the file system errors, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The CLSID was retrieved successfully.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_CANTOPENFILE</term>
|
||
/// <term>Unable to open the specified file name.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_INVALIDEXTENSION</term>
|
||
/// <term>The specified extension in the registry is invalid.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// When given a file name, <c>GetClassFile</c> finds the CLSID associated with that file. Examples of its use are in the
|
||
/// OleCreateFromFile function, which is passed a file name and requires an associated CLSID, and in the OLE implementation of
|
||
/// IMoniker::BindToObject, which, when a link to a file-based document is activated, calls <c>GetClassFile</c> to locate the object
|
||
/// application that can open the file.
|
||
/// </para>
|
||
/// <para><c>GetClassFile</c> uses the following strategies to determine an appropriate CLSID:</para>
|
||
/// <list type="number">
|
||
/// <item>
|
||
/// <term>
|
||
/// If the file contains a storage object, as determined by a call to the StgIsStorageFile function, <c>GetClassFile</c> returns the
|
||
/// CLSID that was written with the IStorage::SetClass method.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the file is not a storage object, <c>GetClassFile</c> attempts to match various bits in the file against a pattern in the
|
||
/// registry. A pattern in the registry can contain a series of entries of the form:
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the above strategies fail, <c>GetClassFile</c> searches for the <c>File Extension</c> key in the registry that corresponds to
|
||
/// the .ext portion of the file name. If the database entry contains a valid CLSID, <c>GetClassFile</c> returns that CLSID.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>If all strategies fail, the function returns MK_E_INVALIDEXTENSION.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-getclassfile HRESULT GetClassFile( LPCOLESTR szFilename,
|
||
// CLSID *pclsid );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "dc3cb263-7b9a-45f9-8eab-3a88aa9392db")]
|
||
public static extern HRESULT GetClassFile([MarshalAs(UnmanagedType.LPWStr)] string szFilename, out Guid pclsid);
|
||
|
||
/// <summary>Returns a pointer to the IRunningObjectTable interface on the local running object table (ROT).</summary>
|
||
/// <param name="reserved">This parameter is reserved and must be 0.</param>
|
||
/// <param name="pprot">
|
||
/// The address of an IRunningObjectTable* pointer variable that receives the interface pointer to the local ROT. When the function
|
||
/// is successful, the caller is responsible for calling Release on the interface pointer. If an error occurs, *pprot is undefined.
|
||
/// </param>
|
||
/// <returns>This function can return the standard return values E_UNEXPECTED and S_OK.</returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// Each workstation has a local ROT that maintains a table of the objects that have been registered as running on that computer.
|
||
/// This function returns an IRunningObjectTable interface pointer, which provides access to that table.
|
||
/// </para>
|
||
/// <para>
|
||
/// Moniker providers, which hand out monikers that identify objects so they are accessible to others, should call
|
||
/// <c>GetRunningObjectTable</c>. Use the interface pointer returned by this function to register your objects when they begin
|
||
/// running, to record the times that those objects are modified, and to revoke their registrations when they stop running. See the
|
||
/// IRunningObjectTable interface for more information.
|
||
/// </para>
|
||
/// <para>
|
||
/// Compound-document link sources are the most common example of moniker providers. These include server applications that support
|
||
/// linking to their documents (or portions of a document) and container applications that support linking to embeddings within their
|
||
/// documents. Server applications that do not support linking can also use the ROT to cooperate with container applications that
|
||
/// support linking to embeddings.
|
||
/// </para>
|
||
/// <para>
|
||
/// If you are implementing the IMoniker interface to write a new moniker class, and you need an interface pointer to the ROT, call
|
||
/// IBindCtx::GetRunningObjectTable rather than the <c>GetRunningObjectTable</c> function. This allows future implementations of the
|
||
/// IBindCtx interface to modify binding behavior.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/desktop/api/objbase/nf-objbase-getrunningobjecttable HRESULT GetRunningObjectTable( DWORD
|
||
// reserved, LPRUNNINGOBJECTTABLE *pprot );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "65d9cf7d-cc8a-4199-9a4a-7fd67ef8872d")]
|
||
public static extern HRESULT GetRunningObjectTable([Optional] uint reserved, out IRunningObjectTable pprot);
|
||
|
||
/// <summary>Determines whether two GUIDs are equal.</summary>
|
||
/// <param name="rguid1">The first GUID.</param>
|
||
/// <param name="rguid2">The second GUID.</param>
|
||
/// <returns><see langword="true"/> if equal; <see langword="false"/> otherwise.</returns>
|
||
/// <remarks><c>IsEqualGUID</c> is used by the IsEqualCLSID and IsEqualIID functions.</remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/guiddef/nf-guiddef-isequalguid void IsEqualGUID( rguid1, rguid2 );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("guiddef.h", MSDNShortId = "3580a0c4-e1f8-4bb7-ba66-c4702ecd11f1")]
|
||
public static extern bool IsEqualGUID(Guid rguid1, Guid rguid2);
|
||
|
||
/// <summary>
|
||
/// <para>Converts a string into a moniker that identifies the object named by the string.</para>
|
||
/// <para>
|
||
/// This function is the inverse of the IMoniker::GetDisplayName operation, which retrieves the display name associated with a moniker.
|
||
/// </para>
|
||
/// </summary>
|
||
/// <param name="pbc">A pointer to the IBindCtx interface on the bind context object to be used in this binding operation.</param>
|
||
/// <param name="szUserName">A pointer to the display name to be parsed.</param>
|
||
/// <param name="pchEaten">
|
||
/// A pointer to the number of characters of szUserName that were consumed. If the function is successful, *pchEaten is the length of
|
||
/// szUserName; otherwise, it is the number of characters successfully parsed.
|
||
/// </param>
|
||
/// <param name="ppmk">
|
||
/// The address of the IMoniker* pointer variable that receives the interface pointer to the moniker that was built from szUserName.
|
||
/// When successful, the function has called AddRef on the moniker and the caller is responsible for calling Release. If an error
|
||
/// occurs, the specified interface pointer will contain as much of the moniker that the method was able to create before the error occurred.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return value E_OUTOFMEMORY, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>The parse operation was successful and the moniker was created.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_SYNTAX</term>
|
||
/// <term>Error in the syntax of a file name or an error in the syntax of the resulting composite moniker.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para>
|
||
/// This function can also return any of the error values returned by IMoniker::BindToObject, IOleItemContainer::GetObject, or IParseDisplayName::ParseDisplayName.
|
||
/// </para>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The <c>MkParseDisplayName</c> function parses a human-readable name into a moniker that can be used to identify a link source.
|
||
/// The resulting moniker can be a simple moniker (such as a file moniker), or it can be a generic composite made up of the component
|
||
/// moniker pieces. For example, the display name "c:\mydir\somefile!item 1"
|
||
/// </para>
|
||
/// <para>
|
||
/// could be parsed into the following generic composite moniker: FileMoniker based on "c:\mydir\somefile") + (ItemMoniker based on
|
||
/// "item 1").
|
||
/// </para>
|
||
/// <para>
|
||
/// The most common use of <c>MkParseDisplayName</c> is in the implementation of the standard <c>Links</c> dialog box, which allows
|
||
/// an end user to specify the source of a linked object by typing in a string. You may also need to call <c>MkParseDisplayName</c>
|
||
/// if your application supports a macro language that permits remote references (reference to elements outside of the document).
|
||
/// </para>
|
||
/// <para>
|
||
/// Parsing a display name often requires activating the same objects that would be activated during a binding operation, so it can
|
||
/// be just as expensive (in terms of performance) as binding. Objects that are bound during the parsing operation are cached in the
|
||
/// bind context passed to the function. If you plan to bind the moniker returned by <c>MkParseDisplayName</c>, it is best to do so
|
||
/// immediately after the function returns, using the same bind context, which removes the need to activate objects a second time.
|
||
/// </para>
|
||
/// <para>
|
||
/// <c>MkParseDisplayName</c> parses as much of the display name as it understands into a moniker. The function then calls
|
||
/// IMoniker::ParseDisplayName on the newly created moniker, passing the remainder of the display name. The moniker returned by
|
||
/// <c>ParseDisplayName</c> is composed onto the end of the existing moniker and, if any of the display name remains unparsed,
|
||
/// <c>ParseDisplayName</c> is called on the result of the composition. This process is repeated until the entire display name has
|
||
/// been parsed.
|
||
/// </para>
|
||
/// <para>
|
||
/// <c>MkParseDisplayName</c> attempts the following strategies to parse the beginning of the display name, using the first one that succeeds:
|
||
/// </para>
|
||
/// <list type="number">
|
||
/// <item>
|
||
/// <term>
|
||
/// The function looks in the Running Object Table for file monikers corresponding to all prefixes of the display name that consist
|
||
/// solely of valid file name characters. This strategy can identify documents that are as yet unsaved.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// The function checks the maximal prefix of the display name, which consists solely of valid file name characters, to see if an OLE
|
||
/// 1 document is registered by that name. In this case, the returned moniker is an internal moniker provided by the OLE 1
|
||
/// compatibility layer of OLE 2.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// The function consults the file system to check whether a prefix of the display name matches an existing file. The file name can
|
||
/// be drive-absolute, drive-relative, working-directory relative, or begin with an explicit network share name. This is the common case.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// If the initial character of the display name is '@', the function finds the longest string immediately following it that conforms
|
||
/// to the legal ProgID syntax. The function converts this string to a CLSID using the CLSIDFromProgID function. If the CLSID
|
||
/// represents an OLE 2 class, the function loads the corresponding class object and asks for an IParseDisplayName interface pointer.
|
||
/// The resulting <c>IParseDisplayName</c> interface is then given the whole string to parse, starting with the '@'. If the CLSID
|
||
/// represents an OLE 1 class, then the function treats the string following the ProgID as an OLE1/DDE link designator having
|
||
/// filename|item syntax.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-mkparsedisplayname HRESULT MkParseDisplayName( LPBC pbc,
|
||
// LPCOLESTR szUserName, ULONG *pchEaten, LPMONIKER *ppmk );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "ada46dd3-e2c5-4ff5-89bd-3805f98b247b")]
|
||
public static extern HRESULT MkParseDisplayName(IBindCtx pbc, [MarshalAs(UnmanagedType.LPWStr)] string szUserName, ref uint pchEaten, out IMoniker ppmk);
|
||
|
||
/// <summary>
|
||
/// <para>
|
||
/// Creates a new moniker based on the common prefix that this moniker (the one comprising the data of this moniker object) shares
|
||
/// with another moniker.
|
||
/// </para>
|
||
/// <para>This function is intended to be called only in implementations of IMoniker::CommonPrefixWith.</para>
|
||
/// </summary>
|
||
/// <param name="pmkThis">
|
||
/// A pointer to the IMoniker interface on one of the monikers for which a common prefix is sought; usually the moniker in which this
|
||
/// call is used to implement IMoniker::CommonPrefixWith.
|
||
/// </param>
|
||
/// <param name="pmkOther">A pointer to the IMoniker interface on the moniker to be compared with the first moniker.</param>
|
||
/// <param name="ppmkCommon">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the moniker based on the common prefix of
|
||
/// pmkThis and pmkOther. When successful, the function has called AddRef on the moniker and the caller is responsible for calling
|
||
/// Release. If an error occurs, the supplied interface pointer value is <c>NULL</c>.
|
||
/// </param>
|
||
/// <returns>
|
||
/// <para>This function can return the standard return values E_OUTOFMEMORY and E_UNEXPECTED, as well as the following values.</para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>A common prefix exists that is neither pmkThis nor pmkOther.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_S_HIM</term>
|
||
/// <term>The entire pmkOther moniker is a prefix of the pmkThis moniker.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_S_ME</term>
|
||
/// <term>The entire pmkThis moniker is a prefix of the pmkOther moniker.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_S_US</term>
|
||
/// <term>The pmkThis and pmkOther monikers are equal.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_NOPREFIX</term>
|
||
/// <term>The monikers have no common prefix.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_NOTBINDABLE</term>
|
||
/// <term>This function was called on a relative moniker. It is not meaningful to take the common prefix of relative monikers.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// Your implementation of IMoniker::CommonPrefixWith should first check whether the other moniker is of a type that you recognize
|
||
/// and handle in a special way. If not, you should call <c>MonikerCommonPrefixWith</c>, passing itself as pmkThis and the other
|
||
/// moniker as pmkOther. <c>MonikerCommonPrefixWith</c> correctly handles the cases where either moniker is a generic composite.
|
||
/// </para>
|
||
/// <para>
|
||
/// You should call this function only if pmkThis and pmkOther are both absolute monikers (where an absolute moniker is either a file
|
||
/// moniker or a generic composite whose leftmost component is a file moniker, and where the file moniker represents an absolute
|
||
/// path). Do not call this function on relative monikers.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-monikercommonprefixwith HRESULT MonikerCommonPrefixWith(
|
||
// LPMONIKER pmkThis, LPMONIKER pmkOther, LPMONIKER *ppmkCommon );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "6caa8c2e-c3d6-45d5-8efe-74d6a2c4a926")]
|
||
public static extern HRESULT MonikerCommonPrefixWith(IMoniker pmkThis, IMoniker pmkOther, out IMoniker ppmkCommon);
|
||
|
||
/// <summary>
|
||
/// <para>
|
||
/// Provides a moniker that, when composed onto the end of the first specified moniker (or one with a similar structure), yields the
|
||
/// second specified moniker.
|
||
/// </para>
|
||
/// <para>This function is intended for use only by IMoniker::RelativePathTo implementations.</para>
|
||
/// </summary>
|
||
/// <param name="pmkSrc">
|
||
/// A pointer to the IMoniker interface on the moniker that, when composed with the relative moniker to be created, produces pmkDest.
|
||
/// This moniker identifies the "source" of the relative moniker to be created.
|
||
/// </param>
|
||
/// <param name="pmkDest">
|
||
/// A pointer to the IMoniker interface on the moniker to be expressed relative to pmkSrc. This moniker identifies the destination of
|
||
/// the relative moniker to be created.
|
||
/// </param>
|
||
/// <param name="ppmkRelPath">
|
||
/// The address of an IMoniker* pointer variable that receives the interface pointer to the new relative moniker. When successful,
|
||
/// the function has called AddRef on the moniker and the caller is responsible for calling Release. If an error occurs, the
|
||
/// interface pointer value is <c>NULL</c>.
|
||
/// </param>
|
||
/// <param name="dwReserved">This parameter is reserved and must be nonzero.</param>
|
||
/// <returns>
|
||
/// <para>
|
||
/// This function can return the standard return values E_INVALIDARG, E_OUTOFMEMORY, and E_UNEXPECTED, as well as the following values.
|
||
/// </para>
|
||
/// <list type="table">
|
||
/// <listheader>
|
||
/// <term>Return code</term>
|
||
/// <term>Description</term>
|
||
/// </listheader>
|
||
/// <item>
|
||
/// <term>S_OK</term>
|
||
/// <term>A meaningful relative path has been returned.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_S_HIM</term>
|
||
/// <term>The only form of the relative path is the other moniker.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>MK_E_NOTBINDABLE</term>
|
||
/// <term>
|
||
/// The pmkSrc parameter is a relative moniker, such as an item moniker, and must be composed with the moniker of its container
|
||
/// before a relative path can be determined.
|
||
/// </term>
|
||
/// </item>
|
||
/// </list>
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// Your implementation of IMoniker::RelativePathTo should first check whether the other moniker is of a type you recognize and
|
||
/// handle in a special way. If not, you should call <c>MonikerRelativePathTo</c>, passing itself as pmkThis and the other moniker as
|
||
/// pmkOther. <c>MonikerRelativePathTo</c> correctly handles the cases where either moniker is a generic composite.
|
||
/// </para>
|
||
/// <para>
|
||
/// You should call this function only if pmkSrc and pmkDest are both absolute monikers, where an absolute moniker is either a file
|
||
/// moniker or a generic composite whose leftmost component is a file moniker, and where the file moniker represents an absolute
|
||
/// path. Do not call this function on relative monikers.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-monikerrelativepathto HRESULT MonikerRelativePathTo(
|
||
// LPMONIKER pmkSrc, LPMONIKER pmkDest, LPMONIKER *ppmkRelPath, BOOL dwReserved );
|
||
[DllImport(Lib.Ole32, SetLastError = false, ExactSpelling = true)]
|
||
[PInvokeData("objbase.h", MSDNShortId = "55ab4db3-a94e-48ba-abe3-44963c35e062")]
|
||
public static extern HRESULT MonikerRelativePathTo(IMoniker pmkSrc, IMoniker pmkDest, out IMoniker ppmkRelPath, [MarshalAs(UnmanagedType.Bool)] bool dwReserved = false);
|
||
|
||
/// <summary>Provides a CO_MTA_USAGE_COOKIE.</summary>
|
||
[StructLayout(LayoutKind.Sequential)]
|
||
public struct CO_MTA_USAGE_COOKIE : IHandle
|
||
{
|
||
private IntPtr handle;
|
||
|
||
/// <summary>Initializes a new instance of the <see cref="CO_MTA_USAGE_COOKIE"/> struct.</summary>
|
||
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
|
||
public CO_MTA_USAGE_COOKIE(IntPtr preexistingHandle) => handle = preexistingHandle;
|
||
|
||
/// <summary>Returns an invalid handle by instantiating a <see cref="CO_MTA_USAGE_COOKIE"/> object with <see cref="IntPtr.Zero"/>.</summary>
|
||
public static CO_MTA_USAGE_COOKIE NULL => new CO_MTA_USAGE_COOKIE(IntPtr.Zero);
|
||
|
||
/// <summary>Gets a value indicating whether this instance is a null handle.</summary>
|
||
public bool IsNull => handle == IntPtr.Zero;
|
||
|
||
/// <summary>Performs an explicit conversion from <see cref="CO_MTA_USAGE_COOKIE"/> to <see cref="IntPtr"/>.</summary>
|
||
/// <param name="h">The handle.</param>
|
||
/// <returns>The result of the conversion.</returns>
|
||
public static explicit operator IntPtr(CO_MTA_USAGE_COOKIE h) => h.handle;
|
||
|
||
/// <summary>Performs an implicit conversion from <see cref="IntPtr"/> to <see cref="CO_MTA_USAGE_COOKIE"/>.</summary>
|
||
/// <param name="h">The pointer to a handle.</param>
|
||
/// <returns>The result of the conversion.</returns>
|
||
public static implicit operator CO_MTA_USAGE_COOKIE(IntPtr h) => new CO_MTA_USAGE_COOKIE(h);
|
||
|
||
/// <summary>Implements the operator !=.</summary>
|
||
/// <param name="h1">The first handle.</param>
|
||
/// <param name="h2">The second handle.</param>
|
||
/// <returns>The result of the operator.</returns>
|
||
public static bool operator !=(CO_MTA_USAGE_COOKIE h1, CO_MTA_USAGE_COOKIE h2) => !(h1 == h2);
|
||
|
||
/// <summary>Implements the operator ==.</summary>
|
||
/// <param name="h1">The first handle.</param>
|
||
/// <param name="h2">The second handle.</param>
|
||
/// <returns>The result of the operator.</returns>
|
||
public static bool operator ==(CO_MTA_USAGE_COOKIE h1, CO_MTA_USAGE_COOKIE h2) => h1.Equals(h2);
|
||
|
||
/// <inheritdoc/>
|
||
public override bool Equals(object obj) => obj is CO_MTA_USAGE_COOKIE h ? handle == h.handle : false;
|
||
|
||
/// <inheritdoc/>
|
||
public override int GetHashCode() => handle.GetHashCode();
|
||
|
||
/// <inheritdoc/>
|
||
public IntPtr DangerousGetHandle() => handle;
|
||
}
|
||
|
||
/// <summary>Represents an interface in a query for multiple interfaces.</summary>
|
||
/// <remarks>
|
||
/// To optimize network performance, most remote activation functions take an array of <c>MULTI_QI</c> structures rather than just a
|
||
/// single IID as input and a single pointer to the requested interface on the object as output, as do local activation functions.
|
||
/// This allows a set of pointers to interfaces to be returned from the same object in a single round-trip to the server. In network
|
||
/// scenarios, requesting multiple interfaces at the time of object construction can save considerable time over using a number of
|
||
/// calls to QueryInterface for unique interfaces, each of which would require a round-trip to the server.
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/desktop/api/objidl/ns-objidl-tagmulti_qi typedef struct tagMULTI_QI { const IID *pIID;
|
||
// IUnknown *pItf; HRESULT hr; } MULTI_QI;
|
||
[PInvokeData("objidl.h", MSDNShortId = "845040c9-fad4-4ac8-856d-d35edbf48ec9")]
|
||
[StructLayout(LayoutKind.Sequential)]
|
||
public struct MULTI_QI
|
||
{
|
||
/// <summary>A pointer to an interface identifier.</summary>
|
||
public IntPtr pIID;
|
||
|
||
/// <summary>A pointer to the interface requested in <c>pIID</c>. This member must be <c>NULL</c> on input.</summary>
|
||
public IntPtr pItf;
|
||
|
||
/// <summary>
|
||
/// The return value of the QueryInterface call to locate the requested interface. Common return values include S_OK and
|
||
/// E_NOINTERFACE. This member must be 0 on input.
|
||
/// </summary>
|
||
public HRESULT hr;
|
||
}
|
||
|
||
/// <summary>
|
||
/// The STGOPTIONS structure specifies features of the storage object, such as sector size, in the StgCreateStorageEx and
|
||
/// StgOpenStorageEx functions.
|
||
/// </summary>
|
||
[PInvokeData("Objbase.h", MSDNShortId = "aa380344")]
|
||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||
public struct STGOPTIONS
|
||
{
|
||
/// <summary>
|
||
/// Specifies the version of the STGOPTIONS structure. It is set to STGOPTIONS_VERSION. <note>When usVersion is set to 1, the
|
||
/// ulSectorSize member can be set.This is useful when creating a large-sector documentation file.However, when usVersion is set
|
||
/// to 1, the pwcsTemplateFile member cannot be used.</note>
|
||
/// <para>In Windows 2000 and later: STGOPTIONS_VERSION can be set to 1 for version 1.</para>
|
||
/// <para>In Windows XP and later: STGOPTIONS_VERSION can be set to 2 for version 2.</para>
|
||
/// <para>For operating systems prior to Windows 2000: STGOPTIONS_VERSION will be set to 0 for version 0.</para>
|
||
/// </summary>
|
||
public ushort usVersion;
|
||
|
||
/// <summary>Reserved for future use; must be zero.</summary>
|
||
public ushort reserved;
|
||
|
||
/// <summary>Specifies the sector size of the storage object. The default is 512 bytes.</summary>
|
||
public uint ulSectorSize;
|
||
|
||
/// <summary>
|
||
/// Specifies the name of a file whose Encrypted File System (EFS) metadata will be transferred to a newly created Structured
|
||
/// Storage file. This member is valid only when STGFMT_DOCFILE is used with StgCreateStorageEx.
|
||
/// <para>
|
||
/// In Windows XP and later: The pwcsTemplateFile member is only valid if version 2 or later is specified in the usVersion member.
|
||
/// </para>
|
||
/// </summary>
|
||
public string pwcsTemplateFile;
|
||
}
|
||
|
||
/// <summary>Identifies a remote computer resource to the activation functions.</summary>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// The <c>COSERVERINFO</c> structure is used primarily to identify a remote system in object creation functions. Computer resources
|
||
/// are named using the naming scheme of the network transport. By default, all UNC ("\server" or "server") and DNS names
|
||
/// ("domain.com", "example.microsoft.com", or "135.5.33.19") names are allowed.
|
||
/// </para>
|
||
/// <para>
|
||
/// If <c>pAuthInfo</c> is set to <c>NULL</c>, Snego will be used to negotiate an authentication service that will work between the
|
||
/// client and server. However, a non- <c>NULL</c> COAUTHINFO structure can be specified for <c>pAuthInfo</c> to meet any one of the
|
||
/// following needs:
|
||
/// </para>
|
||
/// <list type="bullet">
|
||
/// <item>
|
||
/// <term>
|
||
/// To specify a different client identity for computer remote activations. The specified identity will be used for the launch
|
||
/// permission check on the server rather than the real client identity.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>
|
||
/// To specify that Kerberos, rather than NTLMSSP, is used for machine remote activation. A nondefault client identity may or may not
|
||
/// be specified.
|
||
/// </term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>To request unsecure activation.</term>
|
||
/// </item>
|
||
/// <item>
|
||
/// <term>To specify a proprietary authentication service.</term>
|
||
/// </item>
|
||
/// </list>
|
||
/// <para>
|
||
/// If <c>pAuthInfo</c> is not <c>NULL</c>, those values will be used to specify the authentication settings for the remote call.
|
||
/// These settings will be passed to the RpcBindingSetAuthInfoEx function.
|
||
/// </para>
|
||
/// <para>
|
||
/// If the pAuthInfo parameter is <c>NULL</c>, then dwAuthnLevel can be overridden by the authentication level set by the
|
||
/// CoInitializeSecurity function. If the <c>CoInitializeSecurity</c> function isn't called, then the authentication level specified
|
||
/// under the AppID registry key is used, if it exists.
|
||
/// </para>
|
||
/// <para>
|
||
/// Starting with Windows XP with Service Pack 2 (SP2), dwAuthnLevel is the maximum of RPC_C_AUTHN_LEVEL_CONNECT and the process-wide
|
||
/// authentication level of the client process that is issuing the activation request. For earlier versions of the operating system,
|
||
/// this is RPC_C_AUTHN_LEVEL_CONNECT.
|
||
/// </para>
|
||
/// </remarks>
|
||
// https://docs.microsoft.com/en-us/windows/desktop/api/objidl/ns-objidl-_coserverinfo typedef struct _COSERVERINFO { DWORD
|
||
// dwReserved1; LPWSTR pwszName; COAUTHINFO *pAuthInfo; DWORD dwReserved2; } COSERVERINFO;
|
||
[PInvokeData("objidl.h", MSDNShortId = "88c94a7f-5cf0-4d61-833f-91cba45d8624")]
|
||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||
public class COSERVERINFO
|
||
{
|
||
/// <summary>This member is reserved and must be 0.</summary>
|
||
public uint dwReserved1;
|
||
|
||
/// <summary>The name of the computer.</summary>
|
||
public string pwszName;
|
||
|
||
/// <summary>
|
||
/// A pointer to a COAUTHINFO structure to override the default activation security for machine remote activations. Otherwise,
|
||
/// set to <c>NULL</c> to indicate that default values should be used. For more information, see the Remarks section.
|
||
/// </summary>
|
||
public IntPtr pAuthInfo;
|
||
|
||
/// <summary>This member is reserved and must be 0.</summary>
|
||
public uint dwReserved2;
|
||
}
|
||
}
|
||
} |