IConnectionPoint and .NET or: How I Learned to Stop Worrying and Love Managed Event Sinks (part 1): Sample 3
Sample 3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
namespace Sample3
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public sealed class WorkbookEventSink : Excel.WorkbookEvents
{
#region WorkbookEvents Members
public void Activate() { throw new NotImplementedException(); }
public void AddinInstall() { throw new NotImplementedException(); }
public void AddinUninstall() { throw new NotImplementedException(); }
public void AfterXmlExport(Excel.XmlMap Map, string Url, Excel.XlXmlExportResult Result) { throw new NotImplementedException(); }
public void AfterXmlImport(Excel.XmlMap Map, bool IsRefresh, Excel.XlXmlImportResult Result) { throw new NotImplementedException(); }
public void BeforeClose(ref bool Cancel)
{
Cancel = DialogResult.Yes != MessageBox.Show("Really close?", "Excel", MessageBoxButtons.YesNo);
}
public void BeforePrint(ref bool Cancel) { throw new NotImplementedException(); }
public void BeforeSave(bool SaveAsUI, ref bool Cancel) { throw new NotImplementedException(); }
public void BeforeXmlExport(Excel.XmlMap Map, string Url, ref bool Cancel) { throw new NotImplementedException(); }
public void BeforeXmlImport(Excel.XmlMap Map, string Url, bool IsRefresh, ref bool Cancel) { throw new NotImplementedException(); }
public void Deactivate() { throw new NotImplementedException(); }
public void NewSheet(object Sh) { throw new NotImplementedException(); }
public void Open() { throw new NotImplementedException(); }
public void PivotTableCloseConnection(Excel.PivotTable Target) { throw new NotImplementedException(); }
public void PivotTableOpenConnection(Excel.PivotTable Target) { throw new NotImplementedException(); }
public void RowsetComplete(string Description, string Sheet, bool Success) { throw new NotImplementedException(); }
public void SheetActivate(object Sh) { throw new NotImplementedException(); }
public void SheetBeforeDoubleClick(object Sh, Excel.Range Target, ref bool Cancel) { throw new NotImplementedException(); }
public void SheetBeforeRightClick(object Sh, Excel.Range Target, ref bool Cancel) { throw new NotImplementedException(); }
public void SheetCalculate(object Sh) { throw new NotImplementedException(); }
public void SheetChange(object Sh, Excel.Range Target) { throw new NotImplementedException(); }
public void SheetDeactivate(object Sh) { throw new NotImplementedException(); }
public void SheetFollowHyperlink(object Sh, Excel.Hyperlink Target) { throw new NotImplementedException(); }
public void SheetPivotTableUpdate(object Sh, Excel.PivotTable Target) { throw new NotImplementedException(); }
public void SheetSelectionChange(object Sh, Excel.Range Target) { throw new NotImplementedException(); }
public void Sync(Office.MsoSyncEventType SyncEventType) { throw new NotImplementedException(); }
public void WindowActivate(Excel.Window Wn) { throw new NotImplementedException(); }
public void WindowDeactivate(Excel.Window Wn) { throw new NotImplementedException(); }
public void WindowResize(Excel.Window Wn) { throw new NotImplementedException(); }
#endregion
internal WorkbookEventSink()
{
}
}
internal static class Program
{
private static Excel.Application _application;
private static Excel.Workbook _workbook;
private static void Main(string[] args)
{
_application = new Excel.ApplicationClass();
_application.Visible = true;
_workbook = _application.Workbooks.Add(Type.Missing);
// Hook up event sink using IConnectionPoint.
WorkbookEventSink workbookEventSink = new WorkbookEventSink();
IConnectionPointContainer connectionPointContainer = (IConnectionPointContainer)_workbook;
Guid workbookEventsInterfaceId = typeof(Excel.WorkbookEvents).GUID;
IConnectionPoint connectionPoint;
connectionPointContainer.FindConnectionPoint(ref workbookEventsInterfaceId, out connectionPoint);
int cookie;
connectionPoint.Advise(workbookEventSink, out cookie);
_workbook.Close(false, Type.Missing, Type.Missing);
if (0 == _application.Workbooks.Count)
{
Console.WriteLine("Workbook closed.");
_workbook = null;
}
else
{
Console.WriteLine("Workbook not closed.");
}
if (null != _workbook)
{
if (null != connectionPoint)
{
// Unhook event sink using IConnectionPoint.
connectionPoint.Unadvise(cookie);
connectionPoint = null;
}
}
CleanUp();
}
private static void CleanUp()
{
Console.WriteLine("Cleaning up...");
if (null != _workbook)
{
_workbook.Close(false, Type.Missing, Type.Missing);
_workbook = null;
}
if (null != _application)
{
_application.Quit();
_application = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
}
Comments
- Anonymous
November 01, 2008
Welcome This article was inspired by some work carried out by my friend Misha at http://blogs.msdn.com/mshneer/archive/2008/10/28/better-eventing-support-in-clr-4-0-using-nopia-support.aspx