int OleInterop.IDataObject.DAdvise(OleInterop.FORMATETC[] pFormatetc, uint ADVF, OleInterop.IAdviseSink pAdvSink, out uint pdwConnection) { if (null != oleData) { return(oleData.DAdvise(pFormatetc, ADVF, pAdvSink, out pdwConnection)); } // We have to call the method in the BCL version of the interface, so we need to // convert the parameters to the other type of structure. // As first make sure that the array contains exactly one element. if ((null == pFormatetc) || (pFormatetc.Length != 1)) { throw new ArgumentException(); } // Now convert the patameters BclComTypes.FORMATETC bclFormat = StructConverter.OleFormatETC2Bcl(ref pFormatetc[0]); BclComTypes.IAdviseSink bclSink = pAdvSink as BclComTypes.IAdviseSink; if (null == bclSink) { bclSink = new AdviseSink(pAdvSink); } int connection; int hr = bclData.DAdvise(ref bclFormat, (BclComTypes.ADVF)(ADVF), bclSink, out connection); pdwConnection = (uint)connection; return(hr); }
/// <summary> /// Sets up an advisory connection to the data object. /// </summary> /// <param name="dataObject">The data object on which to set the advisory connection.</param> /// <param name="sink">The advisory sink.</param> /// <param name="format">The format on which to callback on.</param> /// <param name="advf">Advisory flags. Can be 0.</param> /// <returns>The ID of the newly created advisory connection.</returns> public static int Advise(this System.Runtime.InteropServices.ComTypes.IDataObject dataObject, IAdviseSink sink, string format, ADVF advf) { // Internally, we'll listen for any TYMED FORMATETC formatETC; FillFormatETC(format, TYMED_ANY, out formatETC); int connection; int hr = dataObject.DAdvise(ref formatETC, advf, sink, out connection); if (hr != 0) { Marshal.ThrowExceptionForHR(hr); } return(connection); }