BUG: Parameter Office gebeurtenissen annuleren wordt genegeerd in Visual Studio.NET-2003

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 830519 - Bekijk de producten waarop dit artikel van toepassing is.
Dit artikel is gearchiveerd. Het wordt aangeboden in de huidige vorm en wordt niet meer bijgewerkt.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

Wanneer u werkt met Microsoft Visual Studio.NET 2003 u problemen ondervinden wanneer u deAnnulerenparameter in een COM-gebeurtenis die wordt gegenereerd door Microsoft Word Microsoft Excel of door Microsoft Outlook. Hoewel de code ontvangt de COM gebeurtenis en de code kunnen de parameter instellen dienovereenkomstig de COM gebeurtenis niet geannuleerd. Dit probleem treedt op wanneer u COM-Interop met een Managed client (zoals Microsoft Visual C# of Microsoft Visual Basic.NETTO) en ook gebruik van versie 1.1 van Microsoft.NET Framework.

Oorzaak

De.NET Framework 1.1 heeft beveiligingswijzigingen in geïntroduceerd typeveiligheid verbeteren wanneer de COM-component. De.NET Framework 1.1 verbetert typebeveiliging door marshal-informatie in het type bibliotheek van het onderdeel. Wanneer u Word automatiseren Excel of Outlook in een beheerde de COM-client Interop-Assembly (IA) of de primaire Interop-Assembly (PIA) voor Microsoft Office XP gebruikt de type-informatie die is opgeslagen in het Microsoft Office-type bibliotheken om gebeurtenissen te verwerken. Bestaande versies van het woord typebibliotheken de Excel-typebibliotheken en Outlook type bibliotheken markeren deAnnulerenAls de parameter een[in]parameter. DeAnnulerenparameter is gemarkeerd als een[in]parameter zodat de common language runtime dit dwingt beperking en voorkomt dat wijzigingen die beheerde code vanuit naar de aanroeper wordt geretourneerd. Daarom de gebeurtenis niet geannuleerd vanuit een beheerde code IA (of PIA).

Oplossing

Deze fout is gecorrigeerd in Microsoft Office 2003.

Workaround

Als u een eerdere versie van een eerdere versie van Word Excel of een eerdere versie van Outlook, moet u uw eigen verbinding punt sink vast in beheerde code. Een aangepaste handler te voorkomen dat de afhankelijkheid van het type bibliotheek en afgedwongen type-bescherming die meestal van toepassing. Daarom kan het argument worden doorgegeven naar de beller.

Microsoft biedt programming voorbeelden ter illustratie, zonder expliciete of impliciete garantie. Dit omvat, maar is niet beperkt tot impliciete garanties van verkoopbaarheid of geschiktheid voor een bepaald doel. In dit artikel wordt ervan uitgegaan dat u bekend bent met de programmeertaal wordt aangetoond en de hulpmiddelen maken en procedures voor foutopsporing worden gebruikt. Ondersteuningstechnici van Microsoft kunnen de functionaliteit van een bepaalde procedure uitgelegd, maar niet passen deze voorbeelden om functionaliteit toegevoegd of procedures uw specifieke behoeften te maken.

Een helperklasse genereren

Rechtstreeks opvangen van gebeurtenissen van Visual C#, moet u uw definitie van eigen verzendinterface en u moet ook maken een helperklasse de gebeurteniscode implementeren. De definitie van verzendinterface moet overeenkomen met de wereldwijd de unieke id (GUID) en de verzending-id's (DISPID's) voor de gebeurtenis sink die wordt verwacht door de Office-object wilt ontvangen voor gebeurtenissen. Naar Deze waarden zijn, kunt u de volgende methoden:
  • U kunt de Viewer van OLE/COM-Object dat is opgenomen met Visual Studio.NET 2003 Professional Edition
  • U kunt de Platform SDK. Voor meer informatie Bezoek de volgende Microsoft-website over de Platform SDK. website:

    http://www.Microsoft.com/msdownload/platformsdk/sdkupdate
Nadat u de GUID en de DISPID's, kunt u bouwen uw eigen definitie van de definitie van verzendinterface in Visual Basic.NET of Visual C#.

Dit artikel bevat twee voorbeelden die tonen hoe aangepaste verbinding Wijs dit probleem te omzeilen. Het eerste voorbeeld wordt gedemonstreerd hoe wastafel deToepassinggebeurtenissen van het object voor Word 2000 en annuleer deDocumentBeforeClose,gebeurtenis zodat de gebruiker het document niet sluiten. Het tweede voorbeeld sinks deItemSendgebeurtenis voor Outlook 2002 zodat in uw toepassing kunt u de bewerking verzenden Annuleren.

Voorbeeld 1: AnnulerenDocumentBeforeClose,gebeurtenis

  1. Start Visual Studio.2003 NET. Start een nieuw project. SelecteerVisual C#Als het projecttype. SelecteerWindows ToepassingAls de sjabloon. Naam van het projectMyWordEventTest, en klik vervolgens opOK.

    Form1 wordt standaard gemaakt.
  2. Op deProjectmenu, klik opToevoegen Verwijzing. Selecteer in het dialoogvensterMicrosoft Word 9.0 Object BibliotheekCOM tab. Klik opSelecteertoevoegen een referentie en klik vervolgens opOKSluit het dialoogvenster.

    Aangepaste IA wordt automatisch voor u gegenereerd.
  3. Op deProjectmenu, klik opToevoegen een Klasse. SelecteerCodebestand, en de naam van de klasseWord9EventHelper.cs. Klik opOKnaar het bestand genereren.
  4. Voeg de volgende code naar het codevenster voor Word9EventHelper.CS:
    using System;
    using System.Runtime.InteropServices;
    using Word; // The default name for a custom Word IA.
    // If you use Office XP and you have the PIAs
    // referenced in your project, you must change the previous line to read:
    // using Word = Microsoft.Office.Interop.Word;
    
    namespace WordAppEvents9
    {
    	[InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
    	GuidAttribute("000209FE-0000-0000-C000-000000000046")]
    	public interface DWordApplicationEvents9
    	{
    		[DispId(0x00000001)] void Startup();
    		[DispId(0x00000002)] void Quit();
    		[DispId(0x00000003)] void DocumentChange();
    		[DispId(0x00000004)] void DocumentOpen(Word.Document doc);
    		[DispId(0x00000006)] void DocumentBeforeClose(Word.Document doc, ref bool Cancel);	
    		[DispId(0x00000007)] void DocumentBeforePrint(Word.Document doc, ref bool Cancel);
    		[DispId(0x00000008)] void DocumentBeforeSave(Word.Document doc, ref bool SaveAsUI, ref bool Cancel);
    		[DispId(0x00000009)] void NewDocument(Word.Document doc);
    		[DispId(0x0000000a)] void WindowActivate(Word.Document doc, Word.Window wn);
    		[DispId(0x0000000b)] void WindowDeactivate(Word.Document doc, Word.Window wn);
    		[DispId(0x0000000c)] void WindowSelectionChange(Word.Selection sel);
    		[DispId(0x0000000d)] void WindowBeforeRightClick(Word.Selection sel, ref bool Cancel);
    		[DispId(0x0000000e)] void WindowBeforeDoubleClick(Word.Selection sel, ref bool Cancel);
    	}
    
    
    	public class WordAppEventHelper : DWordApplicationEvents9, IDisposable
    	{
    		public WordAppEventHelper()
    		{
    			m_oConnectionPoint = null;
    			m_Cookie = 0;
    		}
    
    		public void Startup()
    		{System.Diagnostics.Debug.WriteLine("Startup");}
    
    		public void Quit()
    		{System.Diagnostics.Debug.WriteLine("Quit");}
    
    		public void DocumentChange()
    		{System.Diagnostics.Debug.WriteLine("DocumentChange");}
    
    		public void DocumentOpen(Word.Document doc)
    		{System.Diagnostics.Debug.WriteLine("DocumentOpen");}
    
    		public void DocumentBeforeClose(Word.Document doc, ref bool Cancel)
    		{
    			System.Diagnostics.Debug.WriteLine("DocumentBeforeClose");
    			Cancel = true; // Cancel the close!
    		}
    
    		public void DocumentBeforePrint(Word.Document doc, ref bool Cancel)
    		{System.Diagnostics.Debug.WriteLine("DocumentBeforePrint");}
    
    		public void DocumentBeforeSave(Word.Document doc, ref bool SaveAsUI, ref bool Cancel)
    		{System.Diagnostics.Debug.WriteLine("DocumentBeforeSave");}
    
    		public void NewDocument(Word.Document doc)
    		{System.Diagnostics.Debug.WriteLine("NewDocument");}
    
    		public void WindowActivate(Word.Document doc, Word.Window wn)
    		{System.Diagnostics.Debug.WriteLine("WindowActivate");}
    
    		public void WindowDeactivate(Word.Document doc, Word.Window wn)
    		{System.Diagnostics.Debug.WriteLine("WindowDeactivate");}
    
    		public void WindowSelectionChange(Word.Selection sel)
    		{System.Diagnostics.Debug.WriteLine("WindowSelectionChange");}
    
    		public void WindowBeforeRightClick(Word.Selection sel, ref bool Cancel)
    		{System.Diagnostics.Debug.WriteLine("WindowBeforeRightClick");}
    
    		public void WindowBeforeDoubleClick(Word.Selection sel, ref bool Cancel)
    		{System.Diagnostics.Debug.WriteLine("WindowBeforeDoubleClick");}
    
    		private UCOMIConnectionPoint m_oConnectionPoint;
    		private int m_Cookie;
    
    		public void SetupConnection(Word.Application app)
    		{
    			if (m_Cookie != 0) return;
    
    			// GUID of the DIID_ApplicationEvents dispinterface.
    			Guid guid = new Guid("{000209FE-0000-0000-C000-000000000046}");
    
    			// QI for IConnectionPointContainer.
    			UCOMIConnectionPointContainer oConnPointContainer = (UCOMIConnectionPointContainer)app;
    
    			// Find the connection point and then advise.
    			oConnPointContainer.FindConnectionPoint(ref guid, out m_oConnectionPoint);
    			m_oConnectionPoint.Advise(this, out m_Cookie);
    		}
    
    		public void RemoveConnection()
    		{
    			if (m_Cookie != 0)
    			{
    				m_oConnectionPoint.Unadvise(m_Cookie);
    				m_oConnectionPoint = null;
    				m_Cookie = 0;
    			}
    		}
    
    		public void Dispose(){RemoveConnection();}
    	}
    }
  5. Overschakelen naar Formulier1 en voeg een opdrachtknop toe. Dubbelklik op de opdrachtknop om het codevenster voor Form1.cs weergegeven. Of op deWeergavemenu, klik opCodeu moet het codevenster Form1.cs weergegeven. De volgende code toevoegen aan de knop-handler voor deKlik opgebeurtenis:
    Word.Document doc;
    Object missing = System.Reflection.Missing.Value;
    
    // Create a new instance of Word and then set up the event handler.
    m_oApp = new Word.ApplicationClass();
    m_oAppEvents = new WordAppEvents9.WordAppEventHelper();
    m_oAppEvents.SetupConnection(m_oApp);
    
    // Make Word visible and then display a new document to test close.
    m_oApp.Visible = true;
    doc = m_oApp.Documents.Add(ref missing, ref missing, ref missing, ref missing);
    doc.UserControl = true;
    doc.Content.Text = "Try to close the document";
    
    // You only have to do this one time in this sample.
    button1.Enabled = false;
    
  6. Voeg de volgende code om deFormulier1klasse voordat de knop-handler:
    Word.Application m_oApp;
    WordAppEvents9.WordAppEventHelper m_oAppEvents;
    
  7. Op deBouwenmenu, klik opBouwen Oplossinghet project maken. Klik opFoutopsporing, en Klik opStartde toepassing wordt uitgevoerd.

    Wanneer de toepassing wordt gestart, kunt u de opdrachtknop en vervolgens Word weergegeven. U niet het Word-venster niet sluiten totdat u de toepassing sluit.

    U kunt vergelijkbare code gebruiken om gebeurtenissen te verwerken voor Excel.

Voorbeeld 2: annulerenItemSendgebeurtenis

  1. Start Visual Studio.2003 NET. Start een nieuw project. SelecteerVisual C#Als het projecttype. SelecteerWindows ToepassingAls de sjabloon. Naam van het projectMyOutlookEventTest, en klik vervolgens opOK.

    Form1 wordt standaard gemaakt.
  2. Op deProjectmenu, klik opToevoegen Verwijzing. Selecteer in het dialoogvensterMicrosoft Outlook 10.0 ObjectbibliotheekCOM tab. Klik opSelecteertoevoegen een referentie en klik vervolgens opOKSluit het dialoogvenster.

    Aangepaste IA wordt automatisch voor u gegenereerd.
  3. Op deProjectmenu, klik opToevoegen een Klasse. SelecteerCodebestand, en de naam van de klasseOutlook10EventHelper.cs. Klik opOKnaar het bestand genereren.
  4. Voeg de volgende code naar het codevenster voor Outlook10EventHelper.CS:
    using System;
    using System.Runtime.InteropServices;
    //using Outlook; // The default name for a custom Word IA.
    // If you use Office XP and you have the PIAs
    // referenced in your project, you must change the previous line to read:
    using Outlook = Microsoft.Office.Interop.Outlook;
    using System.Windows.Forms;
    
    namespace OutlookAppEvents10
    {
    	[InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
    	GuidAttribute("0006300E-0000-0000-C000-000000000046")]
    	public interface DOutlookApplicationEvents_10
    	{
    		void ItemSend(object Item, ref bool Cancel);
    		void NewMail();
    		void Reminder(object Item);
    		void OptionsPagesAdd(Outlook.PropertyPages Pages);
    		void Startup();
    		void Quit();
    		void AdvancedSearchComplete(Outlook.Search SearchObject);
    		void AdvancedSearchStopped(Outlook.Search SearchObject);
    		void MAPILogonComplete();
    	}
    
    	public class OutlookAppEventHelper : IDisposable
    	{
    		public OutlookAppEventHelper()
    		{
    			m_oConnectionPoint = null;
    			m_Cookie = 0;
    		}
    
    		private UCOMIConnectionPoint m_oConnectionPoint;
    		private int m_Cookie;
    
    		public void SetupConnection(Outlook.Application app)
    		{
    			if (m_Cookie != 0) return;
    			// GUID of the DIID_ApplicationEvents dispinterface.
    			Guid guid = new Guid("{0006300E-0000-0000-C000-000000000046}");
    
    			// QI for IConnectionPointContainer.
    			UCOMIConnectionPointContainer oConnectionPointContainer = (UCOMIConnectionPointContainer)app;
    
    			// Find the connection point and then advise.
    			oConnectionPointContainer.FindConnectionPoint(ref guid, out m_oConnectionPoint);
    			m_oConnectionPoint.Advise(this, out m_Cookie);
    		}
    
    		public void RemoveConnection()
    		{
    			if (m_Cookie != 0)
    			{
    				m_oConnectionPoint.Unadvise(m_Cookie);
    				m_oConnectionPoint = null;
    				m_Cookie = 0;
    			}
    		}
    
    		#region IDisposable Members
    
    		public void Dispose()
    		{
    			RemoveConnection();
    		}
    
    		#endregion
    
    		//#region DOutlookApplicationEvents_10 Members
    
    		[DispId(0x0000F002)]
    		public void ItemSend(object Item, ref bool Cancel)
    		{
    			DialogResult result;
    			result = MessageBox.Show("Do you want to cancel the ItemSend event?","",MessageBoxButtons.YesNo);
    			if(result == DialogResult.Yes)
    			{
    				System.Diagnostics.Debug.WriteLine("Cancelling Message");
    				Cancel = true;	
    			}
    			else
    			{
    				System.Diagnostics.Debug.WriteLine("Passing Message");
    				Cancel = false;
    			}
    		}
    
    		[DispId(0x0000F003)]
    		public void NewMail()
    		{
    			MessageBox.Show("NewMail");
    		}
    
    		[DispId(0x0000F004)]
    		public void Reminder(object Item)
    		{
    			MessageBox.Show("Reminder");
    		}
    
    		[DispId(0x0000F005)]
    		public void OptionsPagesAdd(Microsoft.Office.Interop.Outlook.PropertyPages Pages)
    		{
    			MessageBox.Show("OptionsPagesAdd");
    		}
    
    		[DispId(0x0000F006)]
    		public void Startup()
    		{
    			MessageBox.Show("Startup");
    		}
    
    		[DispId(0x0000F007)]
    		public void Quit()
    		{
    			MessageBox.Show("Quit");
    		}
    
    		[DispId(0x0000FA6A)]
    		public void AdvancedSearchComplete(Microsoft.Office.Interop.Outlook.Search SearchObject)
    		{
    			MessageBox.Show("AdvancedSearchComplete");
    		}
    
    		[DispId(0x0000FA6B)]
    		public void AdvancedSearchStopped(Microsoft.Office.Interop.Outlook.Search SearchObject)
    		{
    			MessageBox.Show("AdvancedSearchStopped");
    		}
    
    		[DispId(0x0000FA90)]
    		public void MAPILogonComplete()
    		{
    			MessageBox.Show("MAPILogonComplete");
    		}
    		//#endregion
    	}
    }
    OpmerkingU moet het kenmerk [DispId(#)] op de methoden. Anders kan de gebeurtenis kan niet worden geannuleerd.
  5. Overschakelen naar Formulier1 en voeg een opdrachtknop toe. Dubbelklik op de opdrachtknop om het codevenster voor Form1.cs weergegeven. Of op deWeergavemenu, klik opCodeu moet het codevenster Form1.cs weergegeven. De volgende code toevoegen aan de knop-handler voor deKlik opgebeurtenis:
    Outlook.MailItem item;
    
    if (m_oApp == null)
    {
    	// Create a new instance of Outlook and then set up the event handler.
    	m_oApp = new Outlook.ApplicationClass();
    	m_oAppEvents = new OutlookAppEvents10.OutlookAppEventHelper();
    	m_oAppEvents.SetupConnection(m_oApp);
    } 
    
    // Make Outlook visible and then display a new message to test send.
    item = (Outlook.MailItem)m_oApp.CreateItem(Outlook.OlItemType.olMailItem);
    item.Subject = "The Subject!";
    item.Body = "Try sending the message.";
    item.Display(m_oApp);
  6. Voeg de volgende code om deFormulier1klasse voordat de knop-handler:
    Outlook.Application m_oApp;
    OutlookAppEvents10.OutlookAppEventHelper m_oAppEvents;
    
  7. Op deBouwenmenu, klik opBouwen Oplossinghet project maken. Klik opFoutopsporing, en Klik opStartde toepassing wordt uitgevoerd.

    Wanneer de toepassing wordt gestart, kunt u de opdrachtknop en vervolgens Outlook weergegeven. Het concept van een nieuwe e-mail wordt automatisch gemaakt. Invoer van een geadresseerde in deNaarregel en klik vervolgens opVerzenden. U krijgt een pop-up-dialoogvenster vraag wilt annuleren van de gebeurtenis ItemSend. Klik opJaom te annuleren.

    U kunt dezelfde code verwerken gebeurtenissen voor Excel.

Status

Microsoft heeft bevestigd dat dit probleem in de Microsoft-producten die worden vermeld is in de sectie 'Van toepassing op' van dit artikel.

Referenties

Voor meer informatie over het automatiseren van Office uit Visual Studio .NET, klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
311452Ontwikkelen van Microsoft Office oplossingen met Visual Studio.NET
317109Office-toepassing niet afgesloten nadat de automatisering van Visual Studio.NETTO-client

Eigenschappen

Artikel ID: 830519 - Laatste beoordeling: donderdag 27 februari 2014 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Outlook 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Outlook 2000 Standard Edition
  • Microsoft .NET Framework 1.1
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Academic Edition
Trefwoorden: 
kbnosurvey kbarchive kbnofix kbbug kbmt KB830519 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:830519

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com