/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

cpp_quote("#include <winapifamily.h>")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")

#include <olectl.h>

import "ocidl.idl";

#include "shdispid.h"

dispinterface DShellFolderViewEvents;
interface IAutoComplete;
interface FolderItem;
interface FolderItems;
interface FolderItemVerb;
interface FolderItemVerbs;

[uuid (50a7e9b0-70ef-11d1-b75a-00a0c90564fe), lcid (0x0000), version (1.0)]
library Shell32 {
  importlib ("stdole2.tlb");

  [uuid (9ba05970-F6A8-11cf-A442-00a0c90a8f39), hidden, oleautomation, dual, odl]
  interface IFolderViewOC : IDispatch {
    HRESULT SetFolderView ([in] IDispatch *pdisp);
  }

  [uuid (62112aa2-ebe4-11cf-a5fb-0020afe7292d)]
  dispinterface DShellFolderViewEvents {
    properties:
    methods:
    [id (DISPID_SELECTIONCHANGED)] void SelectionChanged ();
    [id (DISPID_FILELISTENUMDONE)] void EnumDone ();
    [id (DISPID_VERBINVOKED)] VARIANT_BOOL VerbInvoked ();
    [id (DISPID_DEFAULTVERBINVOKED)] VARIANT_BOOL DefaultVerbInvoked ();
    [id (DISPID_BEGINDRAG)] VARIANT_BOOL BeginDrag ();
  }

  [uuid (9ba05971-F6A8-11cf-A442-00a0c90a8f39), hidden]
  coclass ShellFolderViewOC {
    [default] interface IFolderViewOC;
    [default, source] dispinterface DShellFolderViewEvents;
  }

  [uuid (4a3df050-23bd-11d2-939f-00a0c91eedba), oleautomation, dual]
  interface DFConstraint : IDispatch {
    [propget] HRESULT Name ([out, retval] BSTR *pbs);
    [propget] HRESULT Value ([out, retval] VARIANT *pv);
  }

  [uuid (BBCBDE60-C3FF-11ce-8350-444553540000), oleautomation, dual]
  interface Folder : IDispatch {
    [id (0), propget] HRESULT Title ([out, retval] BSTR *pbs);
    [propget] HRESULT Application ([out, retval] IDispatch **ppid);
    [propget] HRESULT Parent ([out, retval] IDispatch **ppid);
    [propget] HRESULT ParentFolder ([out, retval] Folder **ppsf);
    HRESULT Items ([out, retval] FolderItems **ppid);
    HRESULT ParseName ([in] BSTR bName,[out, retval] FolderItem **ppid);
    HRESULT NewFolder ([in] BSTR bName,[in, optional] VARIANT vOptions);
    HRESULT MoveHere ([in] VARIANT vItem,[in, optional] VARIANT vOptions);
    HRESULT CopyHere ([in] VARIANT vItem,[in, optional] VARIANT vOptions);
    HRESULT GetDetailsOf ([in] VARIANT vItem,[in] int iColumn,[out, retval]BSTR *pbs);
  }

  [uuid (f0d2d8ef-3890-11d2-bf8b-00c04fb93661), oleautomation, dual]
  interface Folder2 : Folder {
    [propget] HRESULT Self ([out, retval] FolderItem **ppfi);
    [propget] HRESULT OfflineStatus ([out, retval] LONG *pul);
    HRESULT Synchronize (void);
    [id (1), propget] HRESULT HaveToShowWebViewBarricade ([out, retval] VARIANT_BOOL *pbHaveToShowWebViewBarricade);
    HRESULT DismissedWebViewBarricade ();
  }

  typedef [uuid (35f1a0d0-3e9a-11d2-8499-005345000000)] enum OfflineFolderStatus {
    OFS_INACTIVE = -1,
    OFS_ONLINE,
    OFS_OFFLINE,
    OFS_SERVERBACK,
    OFS_DIRTYCACHE,
  } OfflineFolderStatus;

  [uuid (A7AE5F64-C4D7-4d7f-9307-4d24ee54b841), oleautomation, dual]
  interface Folder3 : Folder2 {
    [id (2), propget] HRESULT ShowWebViewBarricade ([out, retval] VARIANT_BOOL *pbShowWebViewBarricade);
    [id (2), propput] HRESULT ShowWebViewBarricade ([in] VARIANT_BOOL bShowWebViewBarricade);
  }

  [uuid (FAC32C80-CBE4-11ce-8350-444553540000), oleautomation, dual]
  interface FolderItem : IDispatch {
    typedef [unique] FolderItem *LPFOLDERITEM;
    [propget] HRESULT Application ([out, retval] IDispatch **ppid);
    [propget] HRESULT Parent ([out, retval] IDispatch **ppid);
    [id (0), propget] HRESULT Name ([out, retval] BSTR *pbs);
    [id (0), propput] HRESULT Name ([in] BSTR bs);
    [propget] HRESULT Path ([out, retval]BSTR *pbs);
    [propget] HRESULT GetLink ([out, retval] IDispatch **ppid);
    [propget] HRESULT GetFolder ([out, retval] IDispatch **ppid);
    [propget] HRESULT IsLink ([out, retval] VARIANT_BOOL *pb);
    [propget] HRESULT IsFolder ([out, retval] VARIANT_BOOL *pb);
    [propget] HRESULT IsFileSystem ([out, retval] VARIANT_BOOL *pb);
    [propget] HRESULT IsBrowsable ([out, retval] VARIANT_BOOL *pb);
    [propget] HRESULT ModifyDate ([out, retval] DATE *pdt);
    [propput] HRESULT ModifyDate ([in] DATE dt);
    [propget] HRESULT Size ([out, retval] LONG *pul);
    [propget] HRESULT Type ([out, retval] BSTR *pbs);
    HRESULT Verbs ([out, retval] FolderItemVerbs **ppfic);
    HRESULT InvokeVerb ([in, optional] VARIANT vVerb);
  }

  [uuid (edc817aa-92b8-11d1-b075-00c04fc33aa5), oleautomation, dual]
  interface FolderItem2 : FolderItem {
    HRESULT InvokeVerbEx ([in, optional] VARIANT vVerb,[in, optional] VARIANT vArgs);
    HRESULT ExtendedProperty ([in] BSTR bstrPropName,[out, retval] VARIANT *pvRet);
  }

  [uuid (2fe352ea-fd1f-11d2-b1f4-00c04f8eeb3e), noncreatable]
  coclass ShellFolderItem {
    [default] interface FolderItem2;
  }

  [uuid (744129e0-CBE5-11ce-8350-444553540000), oleautomation, dual]
  interface FolderItems : IDispatch {
    [propget] HRESULT Count ([out, retval] long *plCount);
    [propget] HRESULT Application ([out, retval] IDispatch **ppid);
    [propget] HRESULT Parent ([out, retval] IDispatch **ppid);
    HRESULT Item ([in, optional] VARIANT index,[out, retval]FolderItem **ppid);
    [id (-4)] HRESULT _NewEnum ([out, retval] IUnknown **ppunk);
  }

  [uuid (C94F0AD0-F363-11d2-A327-00c04f8eec7f), oleautomation, dual, odl]
  interface FolderItems2 : FolderItems {
    HRESULT InvokeVerbEx ([in, optional] VARIANT vVerb,[in, optional] VARIANT vArgs);
  }

  [uuid (eaa7c309-bbec-49d5-821d-64d966cb667f), oleautomation, dual, odl]
  interface FolderItems3 : FolderItems2 {
    HRESULT Filter ([in] long grfFlags,[in] BSTR bstrFileSpec);
    [id (0), propget] HRESULT Verbs ([out, retval] FolderItemVerbs **ppfic);
  }

  [uuid (08ec3e00-50b0-11cf-960c-0080c7f4ee85), oleautomation, dual]
  interface FolderItemVerb : IDispatch {
    [propget] HRESULT Application ([out, retval] IDispatch **ppid);
    [propget] HRESULT Parent ([out, retval] IDispatch **ppid);
    [id (0), propget] HRESULT Name ([out, retval] BSTR *pbs);
    HRESULT DoIt ();
  }

  [uuid (1f8352c0-50b0-11cf-960c-0080c7f4ee85), oleautomation, dual]
  interface FolderItemVerbs : IDispatch {
    [propget] HRESULT Count ([out, retval] long *plCount);
    [propget] HRESULT Application ([out, retval] IDispatch **ppid);
    [propget] HRESULT Parent ([out, retval] IDispatch **ppid);
    HRESULT Item ([in, optional] VARIANT index,[out, retval]FolderItemVerb **ppid);
    [id (-4)] HRESULT _NewEnum ([out, retval] IUnknown **ppunk);
  }

  [uuid (88a05c00-F000-11ce-8350-444553540000), oleautomation, dual, hidden]
  interface IShellLinkDual : IDispatch {
    [propget] HRESULT Path ([out, retval] BSTR *pbs);
    [propput] HRESULT Path ([in] BSTR bs);
    [propget] HRESULT Description ([out, retval] BSTR *pbs);
    [propput] HRESULT Description ([in] BSTR bs);
    [propget] HRESULT WorkingDirectory ([out, retval] BSTR *pbs);
    [propput] HRESULT WorkingDirectory ([in] BSTR bs);
    [propget] HRESULT Arguments ([out, retval] BSTR *pbs);
    [propput] HRESULT Arguments ([in] BSTR bs);
    [propget] HRESULT Hotkey ([out, retval] int *piHK);
    [propput] HRESULT Hotkey ([in] int iHK);
    [propget] HRESULT ShowCommand ([out, retval] int *piShowCommand);
    [propput] HRESULT ShowCommand ([in] int iShowCommand);
    HRESULT Resolve ([in] int fFlags);
    HRESULT GetIconLocation ([out] BSTR *pbs,[out, retval] int *piIcon);
    HRESULT SetIconLocation ([in] BSTR bs,[in] int iIcon);
    HRESULT Save ([in, optional] VARIANT vWhere);
  }

  [uuid (317ee249-F12E-11d2-B1E4-00c04f8eeb3e), oleautomation, dual, hidden]
  interface IShellLinkDual2 : IShellLinkDual {
    [propget] HRESULT Target ([out, retval] FolderItem **ppfi);
  }

  [uuid (11219420-1768-11d1-95be-00609797ea4f), noncreatable]
  coclass ShellLinkObject {
    [default] interface IShellLinkDual2;
  }

  [uuid (E7A1AF80-4d96-11cf-960c-0080c7f4ee85), oleautomation, hidden, dual]
  interface IShellFolderViewDual : IDispatch {
    [propget] HRESULT Application ([out, retval] IDispatch **ppid);
    [propget] HRESULT Parent ([out, retval] IDispatch **ppid);
    [propget] HRESULT Folder ([out, retval] Folder **ppid);
    HRESULT SelectedItems ([out, retval] FolderItems **ppid);
    [propget] HRESULT FocusedItem ([out, retval] FolderItem **ppid);
    HRESULT SelectItem ([in]VARIANT *pvfi,[in] int dwFlags);
    HRESULT PopupItemMenu ([in]FolderItem *pfi,[in, optional]VARIANT vx,[in, optional]VARIANT vy,[out, retval] BSTR *pbs);
    [propget] HRESULT Script ([out, retval] IDispatch **ppDisp);
    [propget] HRESULT ViewOptions ([out, retval] long *plViewOptions);
  }

  [uuid (31c147b6-0ade-4a3c-B514-DDF932EF6D17), oleautomation, hidden, dual]
  interface IShellFolderViewDual2 : IShellFolderViewDual {
    [propget] HRESULT CurrentViewMode ([out, retval] UINT *pViewMode);
    [propput] HRESULT CurrentViewMode ([in] UINT ViewMode);
    HRESULT SelectItemRelative ([in] int iRelative);
  }

  [uuid (29ec8e6c-46d3-411f-BAAA-611a6c9cac66), oleautomation, hidden, dual]
  interface IShellFolderViewDual3 : IShellFolderViewDual2 {
    [propget] HRESULT GroupBy ([out, retval] BSTR *pbstrGroupBy);
    [propput] HRESULT GroupBy ([in] BSTR bstrGroupBy);
    [propget] HRESULT FolderFlags ([out, retval] DWORD *pdwFlags);
    [propput] HRESULT FolderFlags ([in] DWORD dwFlags);
    [propget] HRESULT SortColumns ([out, retval] BSTR *pbstrSortColumns);
    [propput] HRESULT SortColumns ([in] BSTR bstrSortColumns);
    [propput] HRESULT IconSize ([in] int iIconSize);
    [propget] HRESULT IconSize ([out, retval] int *piIconSize);
    HRESULT FilterView ([in, unique] BSTR bstrFilterText);
  }

  [uuid (62112aa1-EBE4-11cf-A5FB-0020afe7292d)]
  coclass ShellFolderView {
    [default] interface IShellFolderViewDual3;
    [source, default] dispinterface DShellFolderViewEvents;
  }

  typedef [uuid (742a99a0-C77E-11d0-A32C-00a0c91eedba)] enum ShellFolderViewOptions {
    SFVVO_SHOWALLOBJECTS = 0x00000001,
    SFVVO_SHOWEXTENSIONS = 0x00000002,
    SFVVO_SHOWCOMPCOLOR = 0x00000008,
    SFVVO_SHOWSYSFILES = 0x00000020,
    SFVVO_WIN95CLASSIC = 0x00000040,
    SFVVO_DOUBLECLICKINWEBVIEW = 0x00000080,
    SFVVO_DESKTOPHTML = 0x00000200,
  } ShellFolderViewOptions;

  [uuid (D8F015C0-C278-11ce-A49E-444553540000), oleautomation, hidden, dual]
  interface IShellDispatch : IDispatch {
    [propget] HRESULT Application ([out, retval] IDispatch **ppid);
    [propget] HRESULT Parent ([out, retval] IDispatch **ppid);
    HRESULT NameSpace ([in] VARIANT vDir,[out, retval] Folder **ppsdf);
    HRESULT BrowseForFolder ([in] long Hwnd,[in] BSTR Title,[in] long Options,[in, optional] VARIANT RootFolder,[out, retval] Folder **ppsdf);
    HRESULT Windows ([out, retval] IDispatch **ppid);
    HRESULT Open ([in] VARIANT vDir);
    HRESULT Explore ([in] VARIANT vDir);
    HRESULT MinimizeAll (void);
    HRESULT UndoMinimizeALL (void);
    HRESULT FileRun (void);
    HRESULT CascadeWindows (void);
    HRESULT TileVertically (void);
    HRESULT TileHorizontally (void);
    HRESULT ShutdownWindows (void);
    HRESULT Suspend (void);
    HRESULT EjectPC (void);
    HRESULT SetTime (void);
    HRESULT TrayProperties (void);
    HRESULT Help (void);
    HRESULT FindFiles (void);
    HRESULT FindComputer (void);
    HRESULT RefreshMenu (void);
    HRESULT ControlPanelItem ([in] BSTR bstrDir);
  }

  [uuid (A4C6892C-3ba9-11d2-9dea-00c04fb16162), oleautomation, hidden, dual]
  interface IShellDispatch2 : IShellDispatch {
    HRESULT IsRestricted ([in] BSTR Group,[in] BSTR Restriction,[out, retval] long *plRestrictValue);
    HRESULT ShellExecute ([in] BSTR File,[in, optional] VARIANT vArgs,[in, optional] VARIANT vDir,[in, optional] VARIANT vOperation,[in, optional] VARIANT vShow);
    HRESULT FindPrinter ([in, optional] BSTR name,[in, optional] BSTR location,[in, optional] BSTR model);
    HRESULT GetSystemInformation ([in] BSTR name,[out, retval] VARIANT *pv);
    HRESULT ServiceStart ([in] BSTR ServiceName,[in] VARIANT Persistent,[out, retval] VARIANT *pSuccess);
    HRESULT ServiceStop ([in] BSTR ServiceName,[in] VARIANT Persistent,[out, retval] VARIANT *pSuccess);
    HRESULT IsServiceRunning ([in] BSTR ServiceName,[out, retval] VARIANT *pRunning);
    HRESULT CanStartStopService ([in] BSTR ServiceName,[out, retval] VARIANT *pCanStartStop);
    HRESULT ShowBrowserBar ([in]BSTR bstrClsid,[in]VARIANT bShow,[out, retval] VARIANT *pSuccess);
  }

  [uuid (177160ca-bb5a-411c-841d-bd38facdeaa0), oleautomation, hidden, dual]
  interface IShellDispatch3 : IShellDispatch2 {
    HRESULT AddToRecent ([in] VARIANT varFile,[in, optional] BSTR bstrCategory);
  }

  [uuid (efd84b2d-4bcf-4298-be25-eb542a59fbda), oleautomation, hidden, dual]
  interface IShellDispatch4 : IShellDispatch3 {
    HRESULT WindowsSecurity (void);
    HRESULT ToggleDesktop (void);
    HRESULT ExplorerPolicy ([in] BSTR bstrPolicyName,[out, retval] VARIANT *pValue);
    HRESULT GetSetting ([in] long lSetting,[out, retval] VARIANT_BOOL *pResult);
  }

  [uuid (866738b9-6cf2-4de8-8767-f794ebe74f4e), oleautomation, hidden, dual]
  interface IShellDispatch5 : IShellDispatch4 {
    HRESULT WindowSwitcher (void);
  }

  cpp_quote("#if NTDDI_VERSION >= NTDDI_WIN8")
  [uuid (286e6f1b-7113-4355-9562-96b7e9d64c54), oleautomation, hidden, dual]
  interface IShellDispatch6 : IShellDispatch5 {
    HRESULT SearchCommand (void);
  }
  cpp_quote("#endif")

    [uuid (13709620-C279-11ce-A49E-444553540000)]
  coclass Shell {
    [default] interface IShellDispatch6;
  }

  [uuid (0a89a860-D7B1-11ce-8350-444553540000), hidden]
  coclass ShellDispatchInproc {
    interface IUnknown;
  }

  typedef [uuid (CA31EA20-48d0-11cf-8350-444553540000)] enum ShellSpecialFolderConstants {
    ssfDESKTOP = 0x0000,
    ssfPROGRAMS = 0x0002,
    ssfCONTROLS = 0x0003,
    ssfPRINTERS = 0x0004,
    ssfPERSONAL = 0x0005,
    ssfFAVORITES = 0x0006,
    ssfSTARTUP = 0x0007,
    ssfRECENT = 0x0008,
    ssfSENDTO = 0x0009,
    ssfBITBUCKET = 0x000a,
    ssfSTARTMENU = 0x000b,
    ssfDESKTOPDIRECTORY = 0x0010,
    ssfDRIVES = 0x0011,
    ssfNETWORK = 0x0012,
    ssfNETHOOD = 0x0013,
    ssfFONTS = 0x0014,
    ssfTEMPLATES = 0x0015,
    ssfCOMMONSTARTMENU = 0x0016,
    ssfCOMMONPROGRAMS = 0x0017,
    ssfCOMMONSTARTUP = 0x0018,
    ssfCOMMONDESKTOPDIR = 0x0019,
    ssfAPPDATA = 0x001a,
    ssfPRINTHOOD = 0x001b,
    ssfLOCALAPPDATA = 0x001c,
    ssfALTSTARTUP = 0x001d,
    ssfCOMMONALTSTARTUP = 0x001e,
    ssfCOMMONFAVORITES = 0x001f,
    ssfINTERNETCACHE = 0x0020,
    ssfCOOKIES = 0x0021,
    ssfHISTORY = 0x0022,
    ssfCOMMONAPPDATA = 0x0023,
    ssfWINDOWS = 0x0024,
    ssfSYSTEM = 0x0025,
    ssfPROGRAMFILES = 0x0026,
    ssfMYPICTURES = 0x0027,
    ssfPROFILE = 0x0028,
    ssfSYSTEMx86 = 0x0029,
    ssfPROGRAMFILESx86 = 0x0030,
  } ShellSpecialFolderConstants;

  [uuid (2d91eea1-9932-11d2-BE86-00a0c9a83da1), oleautomation, dual, hidden, pointer_default (unique)]
  interface IFileSearchBand : IDispatch {
    [id (1)] HRESULT SetFocus (void);
    [id (2)] HRESULT SetSearchParameters ([in] BSTR *pbstrSearchID,[in]VARIANT_BOOL bNavToResults,[in, optional] VARIANT *pvarScope,[in, optional]VARIANT *pvarQueryFile);
    [id (3), propget] HRESULT SearchID ([out, retval] BSTR *pbstrSearchID);
    [id (4), propget] HRESULT Scope ([out, retval] VARIANT *pvarScope);
    [id (5), propget] HRESULT QueryFile ([out, retval] VARIANT *pvarFile);
  };

  [uuid (C4EE31F3-4768-11d2-BE5C-00a0c9a83da1), hidden]
  coclass FileSearchBand {
    [default] interface IFileSearchBand;
  };

  [uuid (18bcc359-4990-4bfb-b951-3c83702be5f9), object, dual]
  interface IWebWizardHost : IDispatch {
    [id (0)] HRESULT FinalBack ();
    [id (1)] HRESULT FinalNext ();
    [id (2)] HRESULT Cancel ();
    [id (3), propput] HRESULT Caption ([in] BSTR bstrCaption);
    [id (3), propget] HRESULT Caption ([out, retval] BSTR *pbstrCaption);
    [id (4), propput] HRESULT Property ([in] BSTR bstrPropertyName,[in] VARIANT *pvProperty);
    [id (4), propget] HRESULT Property ([in] BSTR bstrPropertyName,[out, retval] VARIANT *pvProperty);
    [id (5)] HRESULT SetWizardButtons ([in] VARIANT_BOOL vfEnableBack,[in] VARIANT_BOOL vfEnableNext,[in] VARIANT_BOOL vfLastPage);
    [id (6)] HRESULT SetHeaderText ([in] BSTR bstrHeaderTitle,[in] BSTR bstrHeaderSubtitle);
  };
  [uuid (0751c551-7568-41c9-8e5b-e22e38919236), object, dual]
  interface INewWDEvents: IWebWizardHost {
    [id (7)] HRESULT PassportAuthenticate ([in] BSTR bstrSignInUrl,[out, retval] VARIANT_BOOL *pvfAuthenitcated);
  };
};

[local, object, uuid (00bb2762-6a77-11d0-a535-00c04fd7d062), pointer_default (unique)]
interface IAutoComplete : IUnknown {
  typedef [unique] IAutoComplete *LPAUTOCOMPLETE;

  HRESULT Init ([in] HWND hwndEdit,[in, unique] IUnknown *punkACL,[in, unique] LPCWSTR pwszRegKeyPath,[in] LPCWSTR pwszQuickComplete);
  HRESULT Enable ([in] BOOL fEnable);
}

[local, object, uuid (EAC04BC0-3791-11d2-BB95-0060977b464c), pointer_default (unique)]
interface IAutoComplete2 : IAutoComplete {
  typedef [unique] IAutoComplete2 *LPAUTOCOMPLETE2;
  typedef enum _tagAUTOCOMPLETEOPTIONS {
    ACO_NONE = 0x00,
    ACO_AUTOSUGGEST = 0x01,
    ACO_AUTOAPPEND = 0x02,
    ACO_SEARCH = 0x04,
    ACO_FILTERPREFIXES = 0x08,
    ACO_USETAB = 0x10,
    ACO_UPDOWNKEYDROPSLIST = 0x20,
    ACO_RTLREADING = 0x40,
    ACO_WORD_FILTER = 0x80,
    ACO_NOPREFIXFILTERING = 0x100,
  } AUTOCOMPLETEOPTIONS;

  HRESULT SetOptions ([in] DWORD dwFlag);
  HRESULT GetOptions ([out] DWORD *pdwFlag);
}

cpp_quote("")
[local, object, uuid (8e74c210-CF9D-4eaf-A403-7356428f0a5a), pointer_default (unique)]
interface IEnumACString : IEnumString {
  typedef [unique] IEnumACString *PENUMACSTRING;
  typedef [unique] IEnumACString *LPENUMACSTRING;
  typedef enum _tagACENUMOPTION {
    ACEO_NONE = 0x0000,
    ACEO_MOSTRECENTFIRST = 0x1,
    ACEO_FIRSTUNUSED = 0x10000,
  } ACENUMOPTION;

  HRESULT NextItem ([out, string, unique, size_is (cchMax)] LPWSTR pszUrl,[in] ULONG cchMax,[out] ULONG *pulSortIndex);
  HRESULT SetEnumOptions ([in] DWORD dwOptions);
  HRESULT GetEnumOptions ([out] DWORD *pdwOptions);
}

[uuid (3d8b0590-F691-11d2-8ea9-006097df5bd4), object]
interface IDataObjectAsyncCapability : IUnknown {
  HRESULT SetAsyncMode ([in] BOOL fDoOpAsync);
  HRESULT GetAsyncMode ([out] BOOL *pfIsOpAsync);
  HRESULT StartOperation ([in, unique, optional] IBindCtx *pbcReserved);
  HRESULT InOperation ([out] BOOL *pfInAsyncOp);
  HRESULT EndOperation ([in] HRESULT hResult,[in, unique] IBindCtx *pbcReserved,[in] DWORD dwEffects);
}

cpp_quote("#endif")
