{$IFDEF SHL_IDC}

const
  IDD_SHLOPTS = 101;
  IDC_USEGROUPS = 1014;
  IDC_CLISTGROUPS = 1015;
  // Show "HIT"
  IDC_SHOWFULL = 1016;
  IDC_NOPROF = 1020;
  IDC_SHOWINVISIBLES = 1021;
  IDC_HIDEOFFLINE = 1022;
  // only in the options dialog
  IDC_STATUS = 1023;
  IDC_CAPMENUS = 1025;
  IDC_CAPSTATUS = 1026;
  IDC_CAPSHLSTATUS = 1027;
  IDC_REMOVE = 1028;
  IDC_USEOWNERDRAW = 1029;
{$ENDIF}
{$IFDEF SHL_KEYS}

const
  SHLExt_Name: PChar = 'shlext15';
  SHLExt_MRU: PChar = 'MRU';
  SHLExt_UseGroups: PChar = 'UseGroups';
  SHLExt_UseCListSetting: PChar = 'UseCLGroups';
  SHLExt_UseHITContacts: PChar = 'UseHITContacts';
  // HIT2 contacts will get your messages but don't know your state
  SHLExt_UseHIT2Contacts: PChar = 'UseHIT2Contacts';
  SHLExt_ShowNoProfile: PChar = 'ShowNoProfile';
  SHLExt_ShowNoIcons: PChar = 'ShowNoIcons';
  SHLExt_ShowNoOffline: PChar = 'ShowNoOffline';
{$ENDIF}
{$IFDEF SHLCOM}

const

  S_OK = 0;
  S_FALSE = 1;

  E_UNEXPECTED = $8000FFFF;
  E_NOTIMPL = $80004001;
  E_INVALIDARG = $80070057;

  CLASS_E_NOAGGREGATION = $80040110;
  CLASS_E_CLASSNOTAVAILABLE = $80040111;

  CLSCTX_INPROC_SERVER = $1;

  { for FORMATETC }

  TYMED_HGLOBAL = 1;
  DVASPECT_CONTENT = 1;

type

  PGUID = ^TGUID;

  TGUID = record
    D1: Longword;
    D2: Word;
    D3: Word;
    D4: array [0 .. 7] of Byte;
  end;

  TIID = TGUID;
  TCLSID = TGUID;

  TStgMedium = record
    tymed: Longint;
    case Integer of
      0: (hBitmap: hBitmap; unkForRelease: Pointer { IUnknown } );
      1: (hMetaFilePict: THandle);
      2: (hEnhMetaFile: THandle);
      3: (hGlobal: hGlobal);
      4: (lpszFileName: Pointer { POleStr } );
      5: (stm: Pointer { IUnknown } );
      6: (stg: Pointer { IStorage } );
  end;

  PFormatEtc = ^TFormatEtc;

  TFormatEtc = record
    cfFormat: Word; { TClipFormat; }
    ptd: Pointer; { PDVTargetDevice; }
    dwAspect: Longint;
    lindex: Longint;
    tymed: Longint;
  end;

{$ENDIF}
{$IFDEF COM_STRUCTS}

const

  IID_IUnknown: TGUID = (D1: $00000000; D2: $0000; D3: $0000;
    D4: ($C0, $00, $00, $00, $00, $00, $00, $46));

  IID_IClassFactory: TGUID = (D1: $00000001; D2: $0000; D3: $0000;
    D4: ($C0, $00, $00, $00, $00, $00, $00, $46));

  IID_IShellExtInit: TGUID = (D1: $000214E8; D2: $0000; D3: $0000;
    D4: ($C0, $00, $00, $00, $00, $00, $00, $46));

  IID_IContextMenu: TGUID = (D1: $000214E4; D2: $0000; D3: $0000;
    D4: ($C0, $00, $00, $00, $00, $00, $00, $46));

  IID_IContextMenu2: TGUID = (D1: $000214F4; D2: $0000; D3: $0000;
    D4: ($C0, $00, $00, $00, $00, $00, $00, $46));

  IID_IContextMenu3: TGUID = (D1: $BCFCE0A0; D2: $EC17; D3: $11D0;
    D4: ($8D, $10, $00, $A0, $C9, $0F, $27, $19));

  IID_WICImagingFactory: TGUID = (D1: $EC5EC8A9; D2: $C395; D3: $4314;
    D4: ($9C, $77, $54, $D7, $A9, $35, $FF, $70));


  // Vista+ only

  CLSID_WICImagingFactory: TGUID = (D1: $CACAF262; D2: $9370; D3: $4615;
    D4: ($A1, $3B, $9F, $55, $39, $DA, $4C, $0A));

  // anything before 0.0.1.5 was : {A321A032-7976-11d6-A310-ED893982BF28}
  // changed to a new GUID to avoid older plugins
  // {72013A26-A94C-11d6-8540-A5E62932711D}
  // the IPC header now checks the plugin version given anyway.

  CLSID_ISHLCOM: TGUID = (D1: $72013A26; D2: $A94C; D3: $11D6;
    D4: ($85, $40, $A5, $E6, $29, $32, $71, $1D););
{$ENDIF}
{$IFDEF COMAPI}
function CoCreateInstance(const rclsid: TCLSID; pUnkOuter: Pointer; dwClsContext: DWORD;
  const riid: TIID; var ppv): HResult; stdcall; external 'ole32.dll' name 'CoCreateInstance';
procedure ReleaseStgMedium(var medium: TStgMedium); stdcall;
  external 'ole32.dll' name 'ReleaseStgMedium';
function IsEqualGUID(const guid1, guid2: TGUID): Boolean; stdcall;
  external 'ole32.dll' name 'IsEqualGUID';
function IsEqualIID(const iid1, iid2: TIID): Boolean; stdcall;
  external 'ole32.dll' name 'IsEqualGUID';
function IsEqualCLSID(const clsid1, clsid2: TCLSID): Boolean; stdcall;
  external 'ole32.dll' name 'IsEqualGUID';
function QueueUserAPC(pfnAPC: Pointer; hThread: THandle; dwData: DWORD): BOOL; stdcall;
  external 'kernel32' name 'QueueUserAPC';
{$ENDIF}