diff --git a/PInvoke/Shared/Lib.cs b/PInvoke/Shared/Lib.cs
index d9979d78..34a66947 100644
--- a/PInvoke/Shared/Lib.cs
+++ b/PInvoke/Shared/Lib.cs
@@ -105,6 +105,9 @@
/// The tokenbinding
public const string Tokenbinding = "tokenbinding.dll";
+ /// The url.dll
+ public const string Url = "url.dll";
+
/// The urlmon.dll
public const string UrlMon = "urlmon.dll";
diff --git a/PInvoke/Shell32/IntShcut.cs b/PInvoke/Shell32/IntShcut.cs
new file mode 100644
index 00000000..a81ecbb4
--- /dev/null
+++ b/PInvoke/Shell32/IntShcut.cs
@@ -0,0 +1,353 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+using Vanara.InteropServices;
+
+namespace Vanara.PInvoke
+{
+ /// Interfaces and methods from Url.dll.
+ public static partial class IntShcut
+ {
+ /// Flags used by IUniformResourceLocator::InvokeCommand.
+ [PInvokeData("Intshcut.h")]
+ [Flags]
+ public enum IURL_INVOKECOMMAND_FLAGS
+ {
+ ///
+ /// Interaction with the user is allowed and the hwndParent member of this structure is valid. If this is not set, interaction
+ /// with the user is not allowed and the hwndParent member is ignored.
+ ///
+ IURL_INVOKECOMMAND_FL_ALLOW_UI = 0x0001,
+
+ ///
+ /// Default verb for the Internet Shortcut's protocol should be used and the pcszVerb member is ignored. If this bit is not set,
+ /// the verb is specified by pcszVerb.
+ ///
+ IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB = 0x0002,
+
+ /// Wait for the DDE conversation to terminate before returning.
+ IURL_INVOKECOMMAND_FL_DDEWAIT = 0x0004,
+
+ /// pass SEE_MASK_ASYNCOK to ShellExec
+ IURL_INVOKECOMMAND_FL_ASYNCOK = 0x0008,
+
+ /// Record launch with UA system
+ IURL_INVOKECOMMAND_FL_LOG_USAGE = 0x0010,
+ }
+
+ /// Flags used by IUniformResourceLocator::SetUrl.
+ [PInvokeData("Intshcut.h")]
+ [Flags]
+ public enum IURL_SETURL_FLAGS
+ {
+ ///
+ /// If the protocol scheme is not specified in pcszURL, the system automatically chooses a scheme and adds it to the URL.
+ ///
+ IURL_SETURL_FL_GUESS_PROTOCOL = 0x0001, // Guess protocol if missing
+
+ /// If the protocol scheme is not specified in pcszURL, the system adds the default protocol scheme to the URL.
+ IURL_SETURL_FL_USE_DEFAULT_PROTOCOL = 0x0002, // Use default protocol if missing
+ }
+
+ /// Bit flags that specify how the URL string is to be translated.
+ [PInvokeData("intshcut.h", MSDNShortId = "2f089f5a-4d7c-4bb7-961c-5c6e3e73c7b7")]
+ [Flags]
+ public enum TRANSLATEURL_IN_FLAGS
+ {
+ ///
+ /// If the protocol scheme is not specified in the pcszURL parameter of TranslateURL, the system automatically chooses a scheme
+ /// and adds it to the URL.
+ ///
+ TRANSLATEURL_FL_GUESS_PROTOCOL = 0x0001,
+
+ ///
+ /// If the protocol scheme is not specified in the pcszURL parameter of TranslateURL, the system adds the default protocol to
+ /// the URL.
+ ///
+ TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL = 0x0002,
+ }
+
+ /// The bit flags that specify the behavior of .
+ [PInvokeData("intshcut.h", MSDNShortId = "3158e819-f131-4f57-8516-998955100377")]
+ [Flags]
+ public enum URLASSOCIATIONDIALOG_IN_FLAGS
+ {
+ /// Use the default file name (that is, "Internet Shortcut").
+ URLASSOCDLG_FL_USE_DEFAULT_NAME = 0x0001,
+
+ ///
+ /// Register the selected application as the handler for the protocol specified in pcszURL. The application is registered only
+ /// if this flag is set and the user indicates that a persistent association is desired.
+ ///
+ URLASSOCDLG_FL_REGISTER_ASSOC = 0x0002
+ }
+
+ /// This interface provides methods that retrieve, set, and run commands on an object's URL.
+ [PInvokeData("Intshcut.h")]
+ [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("CABB0DA0-DA57-11CF-9974-0020AFD79762"), CoClass(typeof(InternetShortcut))]
+ public interface IUniformResourceLocator
+ {
+ /// Sets an object's URL.
+ ///
+ /// Address of a zero-terminated string that contains the URL to set. The protocol scheme may be included as part of the URL.
+ ///
+ /// The dw in flags.
+ void SetUrl([MarshalAs(UnmanagedType.LPWStr)] string pcszUrl, IURL_SETURL_FLAGS dwInFlags);
+
+ /// Retrieves an object's URL.
+ ///
+ /// Address of an LPSTR that will be filled with a pointer to the object's URL. Because this method allocates memory for the
+ /// string, you must create and instance of an IMalloc interface and free the memory using IMalloc::Free when it is no longer needed.
+ ///
+ void GetUrl([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CoTaskMemStringMarshaler))] out string ppszUrl);
+
+ /// Runs a command on an object's URL.
+ /// Address of a URLINVOKECOMMANDINFO structure that contains command information for the function.
+ void InvokeCommand(in URLINVOKECOMMANDINFO purlici);
+ }
+
+ /// Determines whether the system is connected to the Internet.
+ ///
+ /// Type: DWORD
+ /// The input flags for the function. This must be set to zero.
+ ///
+ ///
+ /// Type: BOOL
+ ///
+ /// Returns TRUE if the local system is not currently connected to the Internet. Returns FALSE if the local system is
+ /// connected to the Internet or if no attempt has yet been made to connect to the Internet.
+ ///
+ ///
+ // https://docs.microsoft.com/en-us/windows/win32/api/intshcut/nf-intshcut-inetisoffline INTSHCUTAPI BOOL InetIsOffline( DWORD
+ // dwFlags );
+ [DllImport(Lib.Url, SetLastError = false, ExactSpelling = true)]
+ [PInvokeData("intshcut.h", MSDNShortId = "e0afac1c-c083-4b60-a30f-5dfc1a4b8fd3")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static extern bool InetIsOffline(uint dwFlags = 0);
+
+ ///
+ /// Runs the unregistered MIME content type dialog box.
+ /// Note Windows XP Service Pack 2 (SP2) or later: This function is no longer supported.
+ ///
+ ///
+ /// Type: HWND
+ /// A handle to the parent window of any posted child windows.
+ ///
+ ///
+ /// Type: DWORD
+ ///
+ /// A bit flag value that specifies if an association is to be registered. The bit flag is the value MIMEASSOCDLG_FL_REGISTER_ASSOC
+ /// (0x0001). If this bit is set, the selected application is registered as the handler for the given MIME type. If this bit is
+ /// clear, no association is registered.
+ ///
+ /// An application is registered only if this flag is set and the user indicates that a persistent association is to be made.
+ /// Registration is impossible if the string at pcszFile does not contain an extension.
+ ///
+ ///
+ /// Type: PCTSTR
+ ///
+ /// The address of a null-terminated string that contains the name of the target file. This file must conform to the content type
+ /// described by the pcszMIMEContentType parameter.
+ ///
+ ///
+ ///
+ /// Type: PCTSTR
+ /// The address of a null-terminated string that contains the unregistered content type.
+ ///
+ ///
+ /// Type: PTSTR
+ ///
+ /// A pointer to a buffer that, when this function returns successfully, receives the path of the application specified by the user.
+ ///
+ ///
+ ///
+ /// Type: UINT
+ /// Size of pszAppBuf, in characters.
+ ///
+ ///
+ /// Type: HRESULT
+ /// Note As of Windows XP SP2, this function is not supported and returns E_NOTIMPL in all situations.
+ ///
+ /// In supported systems, returns S_OK if the content type was successfully associated with the extension. In this case, the
+ /// extension is associated as the default for the content type, and pszAppBuf points to the string that contains the path of the
+ /// specified application. The function returns S_FALSE if nothing was registered. Otherwise, the return value will be one of the following:
+ ///
+ ///
+ ///
+ /// Return code
+ /// Description
+ ///
+ /// -
+ /// E_ABORT
+ /// The user canceled the operation.
+ ///
+ /// -
+ /// E_FLAGS
+ /// The flag combination passed in dwInFlags is invalid.
+ ///
+ /// -
+ /// E_OUTOFMEMORY
+ /// There was insufficient memory available to complete the operation.
+ ///
+ /// -
+ /// E_POINTER
+ /// One of the input pointers is invalid.
+ ///
+ ///
+ ///
+ ///
+ /// This function does not validate the syntax of the input content type string at pcszMIMEContentType. A successful return value
+ /// does not indicate that the specified MIME content type is valid.
+ ///
+ // https://docs.microsoft.com/en-us/windows/win32/api/intshcut/nf-intshcut-mimeassociationdialoga INTSHCUTAPI HRESULT
+ // MIMEAssociationDialogA( HWND hwndParent, DWORD dwInFlags, PCSTR pcszFile, PCSTR pcszMIMEContentType, PSTR pszAppBuf, UINT
+ // ucAppBufLen );
+ [DllImport(Lib.Url, SetLastError = false, CharSet = CharSet.Auto)]
+ [PInvokeData("intshcut.h", MSDNShortId = "0f8ee95a-3f95-47ee-822b-740ba134cd3c")]
+ [Obsolete]
+ public static extern HRESULT MIMEAssociationDialog(HWND hwndParent, uint dwInFlags, string pcszFile, string pcszMIMEContentType, StringBuilder pszAppBuf, uint ucAppBufLen);
+
+ /// Applies common translations to a given URL string, creating a new URL string.
+ ///
+ /// Type: PCTSTR
+ /// The address of the URL string to be translated.
+ ///
+ ///
+ /// Type: DWORD
+ /// The bit flags that specify how the URL string is to be translated. This value can be a combination of the following:
+ /// TRANSLATEURL_FL_GUESS_PROTOCOL
+ ///
+ /// If the protocol scheme is not specified in the pcszURL parameter to TranslateURL, the system automatically chooses a
+ /// scheme and adds it to the URL.
+ ///
+ /// TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL
+ ///
+ /// If the protocol scheme is not specified in the pcszURL parameter to TranslateURL, the system adds the default protocol to
+ /// the URL.
+ ///
+ ///
+ ///
+ /// Type: PTSTR*
+ ///
+ /// A pointer variable that receives the pointer to the newly created, translated URL string, if any. The ppszTranslatedURL
+ /// parameter is valid only if the function returns S_OK.
+ ///
+ ///
+ ///
+ /// Type: HRESULT
+ ///
+ /// Returns S_OK upon success, or S_FALSE if the URL did not require translation. If an error occurs, the function returns one of
+ /// the following values.
+ ///
+ ///
+ ///
+ /// Return code
+ /// Description
+ ///
+ /// -
+ /// E_FLAGS
+ /// The flag combination passed in dwInFlags is invalid.
+ ///
+ /// -
+ /// E_OUTOFMEMORY
+ /// There was insufficient memory to complete the operation.
+ ///
+ /// -
+ /// E_POINTER
+ /// One of the input pointers is invalid.
+ ///
+ ///
+ ///
+ ///
+ /// This function does not validate the input URL string. A successful return value does not indicate that the URL strings are valid URLs.
+ ///
+ // https://docs.microsoft.com/en-us/windows/win32/api/intshcut/nf-intshcut-translateurla INTSHCUTAPI HRESULT TranslateURLA( PCSTR
+ // pcszURL, DWORD dwInFlags, PSTR *ppszTranslatedURL );
+ [DllImport(Lib.Url, SetLastError = false, EntryPoint = "TranslateURLW")]
+ [PInvokeData("intshcut.h", MSDNShortId = "2f089f5a-4d7c-4bb7-961c-5c6e3e73c7b7")]
+ public static extern HRESULT TranslateURL([MarshalAs(UnmanagedType.LPWStr)] string pcszURL, TRANSLATEURL_IN_FLAGS dwInFlags, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CoTaskMemStringMarshaler))] out string ppszTranslatedURL);
+
+ ///
+ ///
+ /// Invokes the unregistered URL protocol dialog box. This dialog box allows the user to select an application to associate with a
+ /// previously unknown protocol.
+ ///
+ /// Note Windows XP Service Pack 2 (SP2) or later: This function is no longer supported.
+ ///
+ ///
+ /// Type: HWND
+ /// A handle to the parent window.
+ ///
+ ///
+ /// Type: DWORD
+ /// The bit flags that specify the behavior of the function. This value can be a combination of the following:
+ /// URLASSOCDLG_FL_USE_DEFAULT_NAME
+ /// Use the default file name (that is, "Internet Shortcut").
+ /// URLASSOCDLG_FL_REGISTER_ASSOC
+ ///
+ /// Register the selected application as the handler for the protocol specified in pcszURL. The application is registered only if
+ /// this flag is set and the user indicates that a persistent association is desired.
+ ///
+ ///
+ ///
+ /// Type: PTCSTR
+ /// The address of a constant zero-terminated string that contains the file name to associate with the URLs protocol.
+ ///
+ ///
+ /// Type: PTCSTR
+ /// The address of a constant zero-terminated string that contains the URL with an unknown protocol.
+ ///
+ ///
+ /// Type: PTSTR
+ /// The address of a buffer that receives the path of the application specified by the user.
+ ///
+ ///
+ /// Type: UINT
+ /// The size of pszAppBuf, in characters.
+ ///
+ ///
+ /// Type: HRESULT
+ /// Note As of Windows XP SP2, this function not supported and returns E_NOTIMPL in all situations.
+ ///
+ /// In supported systems, returns S_OK if the application is registered with the URL protocol, or S_FALSE if nothing is registered.
+ /// For example, the function returns S_FALSE when the user elects to perform a one-time execution via the selected application.
+ ///
+ ///
+ // https://docs.microsoft.com/en-us/windows/win32/api/intshcut/nf-intshcut-urlassociationdialoga INTSHCUTAPI HRESULT
+ // URLAssociationDialogA( HWND hwndParent, DWORD dwInFlags, PCSTR pcszFile, PCSTR pcszURL, PSTR pszAppBuf, UINT ucAppBufLen );
+ [DllImport(Lib.Url, SetLastError = false, EntryPoint = "URLAssociationDialogW")]
+ [PInvokeData("intshcut.h", MSDNShortId = "3158e819-f131-4f57-8516-998955100377")]
+ [Obsolete]
+ public static extern HRESULT URLAssociationDialog(HWND hwndParent, URLASSOCIATIONDIALOG_IN_FLAGS dwInFlags, [MarshalAs(UnmanagedType.LPWStr)] string pcszFile, [MarshalAs(UnmanagedType.LPWStr)] string pcszURL, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszAppBuf, uint ucAppBufLen);
+
+ /// Contains information for use with the IUniformResourceLocator::InvokeCommand method.
+ [PInvokeData("Intshcut.h")]
+ [StructLayout(LayoutKind.Sequential)]
+ public struct URLINVOKECOMMANDINFO
+ {
+ /// Size of this structure, in bytes.
+ public uint dwcbSize;
+
+ /// Flag value that specifies how the IUniformResourceLocator::InvokeCommand method will execute.
+ public IURL_INVOKECOMMAND_FLAGS dwFlags;
+
+ /// Handle to the parent window. If dwFlags is set to IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB, this member is ignored.
+ public HWND hwndParent;
+
+ ///
+ /// Address of a zero-terminated string that contains the verb to be invoked by IUniformResourceLocator::InvokeCommand. If
+ /// dwFlags is set to IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB, this member is ignored.
+ ///
+ [MarshalAs(UnmanagedType.LPWStr)]
+ public string pcszVerb;
+
+ /// Gets a default instance of this structure with the size field set appropriately.
+ public static readonly URLINVOKECOMMANDINFO Default = new URLINVOKECOMMANDINFO { dwcbSize = (uint)Marshal.SizeOf(typeof(URLINVOKECOMMANDINFO)) };
+ }
+
+ /// CoClass for IUniformResourceLocator.
+ [PInvokeData("Intshcut.h")]
+ [ComImport, Guid("FBF23B40-E3F0-101B-8488-00AA003E56F8"), ClassInterface(ClassInterfaceType.None)]
+ public class InternetShortcut { }
+ }
+}
\ No newline at end of file
diff --git a/PInvoke/Shell32/Vanara.PInvoke.Shell32.csproj b/PInvoke/Shell32/Vanara.PInvoke.Shell32.csproj
index f406b351..28a0d242 100644
--- a/PInvoke/Shell32/Vanara.PInvoke.Shell32.csproj
+++ b/PInvoke/Shell32/Vanara.PInvoke.Shell32.csproj
@@ -1,7 +1,7 @@
- shell32.dll
+ shell32.dll;url.dll
PInvoke API (methods, structures and constants) imported from Windows Shell32.dll.