{ The contents of this file are subject to the Mozilla Public License  }
{ Version 1.1 (the "License"); you may not use this file except in     }
{ compliance with the License. You may obtain a copy of the License at }
{ http://www.mozilla.org/MPL/                                          }
{                                                                      }
{ Software distributed under the License is distributed on an "AS IS"  }
{ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See  }
{ the License for the specific language governing rights and           }
{ limitations under the License.                                       }
{                                                                      }
{ The Original Code is HLink.pas.                                      }
{                                                                      }
{ The Initial Developer of the Original Code is Ashley Godfrey, all    }
{ Portions created by these individuals are Copyright (C) of Ashley    }
{ Godfrey.                                                             }
{                                                                      }
{**********************************************************************}
{                                                                      }
{ This unit contains a conversion of the C header file, HLink.h used   }
{ for accessing HyperLink library (HLINK.DLL) functions from Delphi.   }
{                                                                      }
{ Unit owner: Ashley Godfrey.                                          }
{ Last modified: April 6, 2004.                                        }
{ Updates available from http://www.evocorp.com                        }
{                                                                      }
{**********************************************************************}

unit HLink;
interface
uses
  SysUtils, Windows, ActiveX, UrlMon;

const
  HLinkDll = 'hlink.dll';

	HLNF_INTERNALJUMP	= $00000001;
	HLNF_OPENINNEWWINDOW	= $00000002;
	HLNF_NAVIGATINGBACK	= $00000004;
	HLNF_NAVIGATINGFORWARD = $00000008;
	HLNF_NAVIGATINGTOSTACKITEM = $00000010;
	HLNF_CREATENOHISTORY = $00000020;

  HLinkGETREF_DEFAULT	= 0;
	HLinkGETREF_ABSOLUTE = 1;
	HLinkGETREF_RELATIVE = 2;

  HLID_PREVIOUS = $FFFFFFFF;
  HLID_NEXT = $FFFFFFFE;
  HLID_CURRENT = $FFFFFFFD;
  HLID_STACKBOTTOM = $FFFFFFFC;
  HLID_STACKTOP = $FFFFFFF;

  HLFNAMEF_DEFAULT	= $00000000;
	HLFNAMEF_TRYCACHE	= $00000001;
	HLFNAMEF_TRYPRETTYTARGET = $00000002;
	HLFNAMEF_TRYFULLTARGET	= $00000004;
	HLFNAMEF_TRYWIN95SHORTCUT	= $0000008;

  HLinkMISC_RELATIVE	= $00000001;

  HLinkSETF_TARGET = $00000001;
	HLinkSETF_LOCATION = $0000002;

  HLSR_HOME = $00000000;
	HLSR_SEARCHPAGE	= $00000001;
	HLSR_HISTORYFOLDER	= $00000002;

  HLSHORTCUTF_DEFAULT	= $00000000;
	HLSHORTCUTF_DONTACTUALLYCREATE	= $00000001;
	HLSHORTCUTF_USEFILENAMEFROMFRIENDLYNAME	= $00000002;
	HLSHORTCUTF_USEUNIQUEFILENAME	= $00000004;
	HLSHORTCUTF_MAYUSEEXISTINGSHORTCUT	= $00000008;

  HLTRANSLATEF_DEFAULT = $00000000;
	HLTRANSLATEF_DONTAPPLYDEFAULTPREFIX	= $00000001;

type
  THLTBINFO = record
    uDockType: ULONG;
    rcTbPos: TRect;
  end;
  _tagHLTBINFO = THLTBINFO;
  pHLTBINFO = ^THLTBINFO;

  THLBWINFO = record
    cbSize: ULONG;
    grfHLBWIF: DWORD;
    rcFramePos: TRect;
    rcDocPos: TRect;
    hltbinfo: THLTBINFO;
  end;
  _tagHLBWINFO = THLBWINFO;
  pHLBWINFO = ^THLBWINFO;

  THLITEM = record
    uHLID: ULONG;
    pwzFriendlyName: pWideChar;
  end;
  tagHLITEM = THLITEM;
  pHLITEM = ^THLITEM;

  IEnumHLITEM = interface(IUnknown)
  ['{79eac9c6-baf9-11ce-8c82-00aa004ba90b}']
    function Next(celt: ULONG; out rgelt: THLITEM;
      pceltFetched: pLongInt): HRESULT; stdcall;
    function Skip(celt: Longint): HResult; stdcall;
    function Reset: HResult; stdcall;
    function Clone(out ppienumhlitem: IEnumHLITEM): HResult; stdcall;
  end;

  IHLinkSite = interface(IUnknown)
  ['{79eac9c2-baf9-11ce-8c82-00aa004ba90b}']
    function QueryService(dwSiteData: DWORD;
      const guidService, riid: TGuid; out ppiunk: IUnknown): HRESULT; stdcall;
    function GetMoniker(dwSiteData, dwAssign, dwWhich: DWORD;
      out ppimk: IMoniker): HRESULT; stdcall;
    function ReadyToNavigate(dwSiteData, dwReserved: DWORD): HRESULT; stdcall;
    function OnNavigationComplete(dwSiteData, dwreserved: DWORD;
      hrError: HRESULT; pwzError: pWideChar): HRESULT; stdcall;
  end;

  IHLinkBrowseContext = interface;

  IHLink = interface(IUnknown)
  ['{79eac9c3-baf9-11ce-8c82-00aa004ba90b}']
    function SetHLinkSite(pihlSite: IHLinkSite;
      dwSiteData: DWORD): HRESULT; stdcall;
    function GetHLinkSite(out ppihlSite: IHLinkSite;
      out pdwSiteData: DWORD): HRESULT; stdcall;
    function SetMonikerReference(grfHLSETF: DWORD;
      pimkTarget: IMoniker; pwzLocation: pWideChar): HRESULT; stdcall;
    function GetMonikerReference(dwWhichRef: DWORD;
      out ppimkTarget: IMoniker; out ppwzLocation: pWideChar): HRESULT; stdcall;
    function SetStringReference(grfHLSETF: DWORD;
      pwzTarget, pwzLocation: pWideChar): HRESULT; stdcall;
    function GetStringReference(dwWhichRef: DWORD;
      out ppwzTarget, ppwzLocation: pWideChar): HRESULT; stdcall;
    function SetFriendlyName(pwzFriendlyName: pWideChar): HRESULT; stdcall;
    function GetFriendlyName(grfHLFNAMEF: DWORD;
      out ppwzFriendlyName: pWideChar): HRESULT; stdcall;
    function SetTargetFrameName(
      pwzTargetFrameName: pWideChar): HRESULT; stdcall;
    function GetTargetFrameName(
      out ppwzTargetFrameName: pWideChar): HRESULT; stdcall;
    function GetMiscStatus(out pdwStatus: DWORD): HRESULT; stdcall;
    function Navigate(grfHLNF: DWORD;
      pibc: IBindCtx; pibsc: IBindStatusCallback;
      pihlbc: IHLinkBrowseContext): HRESULT; stdcall;
    function SetAdditionalParams(
      pwzAdditionalParams: pWideChar): HRESULT; stdcall;
    function GetAdditionalParams(
      out ppwzAdditionalParams: pWideChar): HRESULT; stdcall;
  end;

  IHLinkBrowseContext = interface(IUnknown)
  ['{79eac9c7-baf9-11ce-8c82-00aa004ba90b}']
    function Register(reserved: DWORD; piunk: IUnknown;
      pimk: IMoniker; out pdwRegister: DWORD): HRESULT; stdcall;
    function GetObject(pimk: IMoniker;
      fBindIfRootRegistered: BOOL; out ppiunk: IUnknown): HRESULT; stdcall;
    function Revoke(dwRegister: DWORD): HRESULT; stdcall;
    function SetBrowseWindowInfo(const phlbwi: THLBWINFO): HRESULT; stdcall;
    function GetBrowseWindowInfo(out phlbwi: THLBWINFO): HRESULT; stdcall;
    function SetInitialHLink(
      const pimkTarget: IMoniker; pwzLocation: pWideChar;
      const pwzFriendlyName: pWideChar): HRESULT; stdcall;
    function OnNavigateHLink(grfHLNF: DWORD; pimkTarget: IMoniker;
      pwzLocation: pWideChar; pwzFriendlyName: pWideChar;
      out puHLID: ULONG): HRESULT; stdcall;
    function UpdateHLink(uHLID: ULONG; pimkTarget: IMoniker;
      pwzLocation: pWideChar; pwzFriendlyName: pWideChar): HRESULT; stdcall;
    function EnumNavigationStack(dwResevred: DWORD; grfHLFNAMEF: DWORD;
      out ppienumhlitem: IEnumHLITEM): HRESULT; stdcall;
    function QueryHLink(grfHLQF: DWORD; uHLID: ULONG): HRESULT; stdcall;
    function GetHLink(uHLID: ULONG; out ppihl: IHLink): HRESULT; stdcall;
    function SetCurrentHLink(uHLID: ULONG): HRESULT; stdcall;
    function Clone(piunkOuter: IUnknown; const riid: TGuid;
      out ppiunkObj: IUnknown): HRESULT; stdcall;
    function Close(reserved: DWORD): HRESULT; stdcall;
  end;

  IHLinkTarget = interface(IUnknown)
  ['{79eac9c4-baf9-11ce-8c82-00aa004ba90b}']
    function SetBrowseContext(pihlbc: IHLinkBrowseContext): HRESULT; stdcall;
    function GetBrowseContext(
      out ppihlbc: IHLinkBrowseContext): HRESULT; stdcall;
    function Navigate(grfHLNF: DWORD;
      pwzJumpLocation: pWideChar): HRESULT; stdcall;
    function GetMoniker(pwzLocation: pWideChar; dwAssign: DWORD;
      out ppimkLocation: IMoniker): HRESULT; stdcall;
    function GetFriendlyName(pwzLocation: pWideChar;
      out ppwzFriendlyName: pWideChar): HRESULT; stdcall;
  end;

  IHLinkFrame = interface(IUnknown)
  ['{79eac9c5-baf9-11ce-8c82-00aa004ba90b}']
    function SetBrowseContext(pihlbc: IHLinkBrowseContext): HRESULT; stdcall;
    function GetBrowseContext(out ppihlbc: IHlinkBrowseContext): HRESULT; stdcall;
    function Navigate(grfHLNF: DWORD; pbc: IBindCtx;
      pibsc: IBindStatusCallback; pihlNavigate: IHLink): HRESULT; stdcall;
    function OnNavigate(grfHLNF: DWORD; pimkTarget: IMoniker;
      pwzLocation, pwzFriendlyName: pWideChar;
      dwreserved: DWORD): HRESULT; stdcall;
    function UpdateHlink(uHLID: ULONG; pimkTarget: IMoniker;
      pwzLocation, pwzFriendlyName: pWideChar): HRESULT; stdcall;
  end;

  ITargetFrame2 = interface(IUnknown)
  ['{86D52E11-94A8-11d0-82AF-00C04FD5AE38}']
    function SetFrameName(pszFrameName: LPCWSTR): HRESULT; stdcall;
    function GetFrameName(out ppszFrameName: LPWSTR): HRESULT; stdcall;
    function GetParentFrame(out ppunkParent: IInterface): HRESULT; stdcall;
    function SetFrameSrc(pszFrameSrc: LPCWSTR): HRESULT; stdcall;
    function GetFrameSrc(out ppszFrameSrc: LPWSTR): HRESULT; stdcall;
    function GetFramesContainer(out ppContainer: IOleContainer): HRESULT; stdcall;
    function SetFrameOptions(dwFlags: DWORD): HRESULT; stdcall;
    function GetFrameOptions(out pdwFlags: DWORD): HRESULT; stdcall;
    function SetFrameMargins(dwWidth, dwHeight: DWORD): HRESULT; stdcall;
    function GetFrameMargins(out pdwWidth, pdwHeight: DWORD): HRESULT; stdcall;
    function FindFrame(pszTargetName: LPCWSTR; dwFlags: DWORD;
      out ppunkTargetFrame: IInterface): HRESULT; stdcall;
    function GetTargetAlias(pszTargetName: LPCWSTR;
      out ppszTargetAlias: LPWSTR): HRESULT; stdcall;
  end;

  IUrlHistoryNotify = interface(IOleCommandTarget)
  ['{BC40BEC1-C493-11d0-831B-00C04FD5AE38}']
  end;

function HlinkCreateFromMoniker(pimkTrgt: IMoniker;
  pwzLocation, pwzFriendlyName: LPCWSTR; pihlsite: IHLinkSite;
  dwSiteData: DWORD; piunkOuter: IUnknown; const riid: TGUID;
  out ppvObj): HResult; stdcall;

function HlinkCreateFromString(
  pwzTarget, pwzLocation, pwzFriendlyName: LPCWSTR; pihlsite: IHLinkSite;
  dwSiteData: DWORD; piunkOuter: IUnknown; const riid: TGUID;
  out ppvObj): HResult; stdcall;

function HlinkCreateFromData(piDataObj: IDataObject; pihlsite: IHlinkSite;
  dwSiteData: DWORD; piunkOuter: IUnknown; const riid: TGUID;
  out ppvObj): HResult; stdcall;

function HlinkQueryCreateFromData(piDataObj: IDataObject): HResult; stdcall;

function HlinkClone(pihl: IHLink; const riid: TGUID;
  pihlsiteForClone: IHLinkSite; dwSiteData: DWORD;
  out ppvObj): HResult; stdcall;

function HlinkCreateBrowseContext(piunkOuter: IUnknown;
  const riid: TGUID; out ppvObj): HResult; stdcall;

function HlinkNavigateToStringReference(pwzTarget, pwzLocation: LPCWSTR;
  pihlsite: IHlinkSite; dwSiteData: DWORD; pihlframe: IHlinkFrame;
  grfHLNF: DWORD; pibc: IBindCtx; pibsc: IBindStatusCallback;
  pihlbc: IHlinkBrowseContext): HResult; stdcall;

function HlinkNavigate(pihl: IHLink; pihlframe: IHlinkFrame;
  grfHLNF: DWORD; pbc: IBindCtx; pibsc: IBindStatusCallback;
  pihlbc: IHlinkBrowseContext): HResult; stdcall;

function HlinkOnNavigate(pihlframe: IHlinkFrame; pihlbc: IHlinkBrowseContext;
  grfHLNF: DWORD; pimkTarget: IMoniker; pwzLocation, pwzFriendlyName: LPCWSTR;
  out puHLID: ULONG): HResult; stdcall;

function HlinkUpdateStackItem(pihlframe: IHlinkFrame;
  pihlbc: IHlinkBrowseContext; uHLID: ULONG; pimkTrgt: IMoniker;
  pwzLocation, pwzFriendlyName: LPCWSTR): HResult; stdcall;
                                                                              
function HlinkOnRenameDocument(dwReserved: DWORD; pihlbc: IHlinkBrowseContext;
  pimkOld, pimkNew: IMoniker): HResult; stdcall;
                                                                              
function HlinkResolveMonikerForData(pimkReference: IMoniker;
  reserved: DWORD; pibc: IBindCtx; cFmtetc: ULONG; rgFmtetc: PFormatEtc;
  pibsc: IBindStatusCallback; pimkBase: IMoniker): HResult; stdcall;

function HlinkResolveStringForData(pwzReference: LPCWSTR;
  reserved: DWORD; pibc: IBindCtx; cFmtetc: ULONG; rgFmtetc: PFormatEtc;
  pibsc: IBindStatusCallback; pimkBase: IMoniker): HResult; stdcall;
                                                                              
function HlinkParseDisplayName(pibc: IBindCtx; pwzDisplayName: LPCWSTR;
  fNoForceAbs: BOOL; pcchEaten: pULONG; out ppimk: IMoniker): HResult; stdcall;

function HlinkCreateExtensionServices(pwzAdditionalHeaders: LPCWSTR;
  phwnd: HWND; pszUsername, pszPassword: LPCWSTR; piunkOuter: IUnknown;
  const riid: TGUID; out ppvObj): HResult; stdcall;        

function HlinkPreprocessMoniker(pibc: IBindCtx; pimkIn: IMoniker;
  out ppimkOut: IMoniker): HResult; stdcall;

function OleSaveToStreamEx(piunk: IUnknown; pistm: IStream;
  fClearDirty: BOOL): HResult; stdcall;

function HlinkSetSpecialReference(uReference: ULONG;
  pwzReference: LPCWSTR): HResult; stdcall;

function HlinkGetSpecialReference(uReference: ULONG;
  var ppwzReference: LPWSTR): HResult; stdcall;

function HlinkCreateShortcut(grfHLSHORTCUTF: DWORD; pihl: IHLink;
  pwzDir, pwzFileName: LPCWSTR; var ppwzShortcutFile: LPWSTR;
  dwReserved: DWORD): HResult; stdcall;

function HlinkCreateShortcutFromMoniker(grfHLSHORTCUTF: DWORD;
  pimkTarget: IMoniker; pwzLocation, pwzDir, pwzFileName: LPCWSTR;
  var ppwzShortcutFile: LPCWSTR; dwReserved: DWORD): HResult; stdcall;

function HlinkCreateShortcutFromString(grfHLSHORTCUTF: DWORD;
  pwzTarget, pwzLocation, pwzDir, pwzFileName: LPCWSTR;
  var ppwzShortcutFile: LPCWSTR; dwReserved: DWORD): HResult; stdcall;

function HlinkResolveShortcut(pwzShortcutFileName: LPCWSTR;
  pihlsite: IHLinkSite; dwSiteData: DWORD; piunkOuter: IUnknown;
  const riid: TGUID; out ppvObj): HResult; stdcall;

function HlinkResolveShortcutToMoniker(pwzShortcutFileName: LPCWSTR;
  out ppimkTarget: IMoniker; var ppwzLocation: LPWSTR): HResult; stdcall;
                                                                              
function HlinkResolveShortcutToString(pwzShortcutFileName: LPCWSTR;
  var ppwzTarget, ppwzLocation: LPWSTR): HResult; stdcall;

function HlinkIsShortcut(pwzFileName: LPCWSTR): HResult; stdcall;                                 

function HlinkGetValueFromParams(pwzParams, pwzName: LPCWSTR;
  var ppwzValue: LPWSTR): HResult; stdcall;

function HlinkTranslateURL(pwzURL: LPCWSTR; grfFlags: DWORD;
  var ppwzTranslatedURL: LPWSTR): HResult; stdcall;

implementation

function HlinkCreateFromMoniker; external HLinkDll name 'HlinkCreateFromMoniker';
function HlinkCreateFromString; external HLinkDll name 'HlinkCreateFromString';
function HlinkCreateFromData; external HLinkDll name 'HlinkCreateFromData';
function HlinkQueryCreateFromData; external HLinkDll name 'HlinkQueryCreateFromData';
function HlinkClone; external HLinkDll name 'HlinkClone';
function HlinkCreateBrowseContext; external HLinkDll name 'HlinkCreateBrowseContext';
function HlinkNavigateToStringReference; external HLinkDll name 'HlinkNavigateToStringReference';
function HlinkNavigate; external HLinkDll name 'HlinkNavigate';
function HlinkOnNavigate; external HLinkDll name 'HlinkOnNavigate';
function HlinkUpdateStackItem; external HLinkDll name 'HlinkUpdateStackItem';
function HlinkOnRenameDocument; external HLinkDll name 'HlinkOnRenameDocument';
function HlinkResolveMonikerForData; external HLinkDll name 'HlinkResolveMonikerForData';
function HlinkResolveStringForData; external HLinkDll name 'HlinkResolveStringForData';
function HlinkParseDisplayName; external HLinkDll name 'HlinkParseDisplayName';
function HlinkCreateExtensionServices; external HLinkDll name 'HlinkCreateExtensionServices';
function HlinkPreprocessMoniker; external HLinkDll name 'HlinkPreprocessMoniker';
function OleSaveToStreamEx; external HLinkDll name 'OleSaveToStreamEx';
function HlinkSetSpecialReference; external HLinkDll name 'HlinkSetSpecialReference';
function HlinkGetSpecialReference; external HLinkDll name 'HlinkGetSpecialReference';
function HlinkCreateShortcut; external HLinkDll name 'HlinkCreateShortcut';
function HlinkCreateShortcutFromMoniker; external HLinkDll name 'HlinkCreateShortcutFromMoniker';
function HlinkCreateShortcutFromString; external HLinkDll name 'HlinkCreateShortcutFromString';
function HlinkResolveShortcut; external HLinkDll name 'HlinkResolveShortcut';
function HlinkResolveShortcutToMoniker; external HLinkDll name 'HlinkResolveShortcutToMoniker';
function HlinkResolveShortcutToString; external HLinkDll name 'HlinkResolveShortcutToString';
function HlinkIsShortcut; external HLinkDll name 'HlinkIsShortcut';
function HlinkGetValueFromParams; external HLinkDll name 'HlinkGetValueFromParams';
function HlinkTranslateURL; external HLinkDll name 'HlinkTranslateURL';

end.
 