Chyba: Parametr Storno Office události ignorován v Visual Studio .NET 2003

Překlady článku Překlady článku
ID článku: 830519 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Při práci s Microsoft Visual Studio .NET 2003 může docházet k problémům při použití parametru Storno v události COM, která je aktivována aplikace, Microsoft Excel nebo Microsoft Outlook. Ačkoli kód obdrží události COM a kód parametr lze nastavit odpovídajícím způsobem, COM událostí není zrušeno. K tomuto problému dochází při použití COM InterOp ze spravovaného klienta (například Microsoft Visual C# nebo Microsoft Visual Basic .NET) a také používat verzi 1.1 Microsoft .NET Framework.

Příčina

.NET Framework 1.1 má zavedeny změny zabezpečení zvýšit bezpečnost typů při interakci s součásti. .NET Framework 1.1 zvyšuje bezpečnost typů pomocí zařazovací informace v knihovně typů součásti. Při automatizaci Word, Excel nebo Outlook ze spravovaného klienta sestavení InterOp COM (IA) nebo Primary Interop sestavení (PIA) pro sadu Microsoft Office XP používá typ informací, které jsou uloženy v knihovnách typ Microsoft Office k zpracování událostí. Existující verze aplikace Word zadejte jako parametr [] knihoven, knihoven typů Excel a Outlook typ knihovny značka parametru Storno. Parametr Storno je označen jako parametr [] tak, že vynucuje toto omezení a zabraňuje změny provedené spravovaný kód z vracených volající společného jazykového modulu runtime. Proto nemůže být zrušeno události z IA spravovaný kód (nebo primární sestavení InterOp (PIA)).

Řešení

Tato chyba byla opravena v aplikaci Microsoft Office 2003.

Jak potíže obejít

Pokud používáte dřívější verzi aplikace Word, starší verzi nebo dřívější verzi, je třeba vytvořit vlastní jímky bod připojení ve spravovaném kódu. Vlastní popisovač se můžete vyhnout závislost typu knihovny a vynuceno typ ochrany, která obvykle použít. Proto může být předán argument k volajícímu.

Společnost Microsoft poskytuje ukázky programování pouze pro ilustraci, bez žádné záruky výslovně uvedené nebo odvozené,. včetně, bez omezení, odvozených záruk vztahujících se k obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že uživatel je obeznámen s programovacím jazykem, který je předmětem ukázky, a s nástroji použitými pro vytvoření a ladění skriptu. Pracovníci technické podpory společnosti Microsoft mohou vysvětlit funkce určitého postupu, nemohou však následující příklady rozšířit o další funkce nebo konstrukce podle konkrétních požadavků uživatele.

Generování pomocná třída

Přímo jímku událostí z Visual C#, musíte vytvořit vlastní definici dispinterface a také musíte vytvořit pomocné třídy k implementaci kód události. Definice dispinterface musí odpovídat globálně jedinečný identifikátor (GUID) a identifikátory Pult (DISPIDs) pro jímky událostí je očekáván objekt Office, které chcete jímku událostí. Chcete-li zjistit, jsou tyto hodnoty, použijte některou z následujících metod:
  • Můžete pomocí prohlížeče objektů OLE/COM, která je součástí Visual Studio .NET 2003 Professional Edition
  • Můžete použít Platform SDK. Další informace o Platform SDK na webu společnosti Microsoft:

    http://www.microsoft.com/msdownload/platformsdk/sdkupdate
Po znáte GUID a DISPIDs, můžete vytvořit vlastní definici definice dispinterface v Visual Basic .NET nebo v jazyce Visual C#.

Tento článek obsahuje dva příklady ukazují, jak používat vlastní připojení, přejděte na tento problém vyřešit. První příklad demonstruje umyvadlo události objektu aplikace Word 2000 a potom zrušit událost DocumentBeforeClose tak, aby uživatel dokument nelze zavřít. Druhý příklad sinks ItemSend událostí pro aplikaci Outlook 2002 tak, aby zrušit operaci odesílání v aplikaci.

Příklad 1: událost Storno DocumentBeforeClose

  1. Spusťte aplikaci Visual Studio .NET 2003. Spuštění nového projektu. Vyberte Visual C# jako typ projektu. Vyberte Windows Application jako šablona. Název projektu MyWordEventTest a potom klepněte na tlačítko OK.

    Ve výchozím nastavení je vytvořen Form1.
  2. V nabídce projekt klepněte Přidat Reference. V dialogovém okně vyberte Microsoft Word 9.0 Object Library na kartu COM klepněte na tlačítko Přidat odkaz Vyberte a klepněte na tlačítko OK zavřete dialogové okno.

    Vlastní IA můžete automaticky generováno.
  3. V nabídce projekt klepněte na tlačítko Přidat třídy. Vyberte Soubor kód a název třídy Word9EventHelper.cs. Klepněte na tlačítko OK pro generování souboru.
  4. Přidejte následující kód do okna kódu pro 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. Přepněte zpět do Form1 a přidání příkazového tlačítka. Poklepejte na příkazové tlačítko, pokud je okno kód pro Form1.cs zobrazí. Nebo v nabídce Zobrazit klepněte na tlačítko okno kód pro Form1.cs, se zobrazí Kód. Přidejte následující kód popisovač tlačítko pro event:
    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. Přidejte následující kód třídy Form1 před popisovač tlačítko:
    Word.Application m_oApp;
    WordAppEvents9.WordAppEventHelper m_oAppEvents;
    
  7. V nabídce vytvořit klepněte na příkaz Sestavit řešení provést projektu. Klepnutím na odkaz Debug a potom klepněte na tlačítko Start spustit aplikaci.

    Při spuštění aplikace klepněte na příkazové tlačítko a potom se zobrazí Word. Word okno nelze zavřít, dokud neukončíte aplikaci.

    Podobné kód můžete použít ke zpracování událostí pro Excel.

Příklad 2: Storno ItemSend událostí

  1. Spusťte aplikaci Visual Studio .NET 2003. Spuštění nového projektu. Vyberte Visual C# jako typ projektu. Vyberte Windows Application jako šablona. Název projektu MyOutlookEventTest a potom klepněte na tlačítko OK.

    Ve výchozím nastavení je vytvořen Form1.
  2. V nabídce projekt klepněte Přidat Reference. V dialogovém okně vyberte Objektové knihovny Microsoft Outlook 10.0 na kartu COM klepněte na tlačítko Přidat odkaz Vyberte a klepněte na tlačítko OK zavřete dialogové okno.

    Vlastní IA můžete automaticky generováno.
  3. V nabídce projekt klepněte na tlačítko Přidat třídy. Vyberte Soubor kód a název třídy Outlook10EventHelper.cs. Klepněte na tlačítko OK pro generování souboru.
  4. Přidejte následující kód do okna kódu pro 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
    	}
    }
    Note You need to place the [DispId(#)] attribute on the methods. Jinak událost nemůže být zrušena.
  5. Přepněte zpět do Form1 a přidání příkazového tlačítka. Poklepejte na příkazové tlačítko, pokud je okno kód pro Form1.cs zobrazí. Nebo v nabídce Zobrazit klepněte na tlačítko okno kód pro Form1.cs, se zobrazí Kód. Přidejte následující kód popisovač tlačítko event:
    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. Přidejte následující kód třídy Form1 před popisovač tlačítko:
    Outlook.Application m_oApp;
    OutlookAppEvents10.OutlookAppEventHelper m_oAppEvents;
    
  7. V nabídce vytvořit klepněte na příkaz Sestavit řešení provést projektu. Klepnutím na odkaz Debug a potom klepněte na tlačítko Start spustit aplikaci.

    Při spuštění aplikace klepněte na příkazové tlačítko a potom se zobrazí Outlook. Nový e-mail koncept je vytvořen automaticky. Vstupní příjemce v řádku Komu a potom klepněte na tlačítko Odeslat. Dostanete pop up dialogové okno s dotazem, zda chcete zrušit událost ItemSend. Klepněte na tlačítko Ano ji zrušit.

    Podobné kód můžete použít ke zpracování událostí pro Excel.

Prohlášení

Společnost Microsoft potvrzuje, že se jedná o problém v produktech společnosti, které jsou uvedeny v části "Platí pro" v tomto článku.

Odkazy

Další informace o automatizaci Office z aplikace Visual Studio .NET, klepněte na následující číslo článku databáze Microsoft Knowledge Base:
311452Vytváření řešení pro systém Microsoft Office pomocí aplikace Visual Studio .NET (Tento článek může obsahovat odkazy na anglický obsah (dosud nepřeložený).)
317109Aplikace sady Office není ukončit po automatizace z klienta Visual Studio .NET

Vlastnosti

ID článku: 830519 - Poslední aktualizace: 28. února 2014 - Revize: 3.5
Informace v tomto článku jsou určeny pro produkt:
  • 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
  • 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
Klíčová slova: 
kbnosurvey kbarchive kbmt kbnofix kbbug KB830519 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku: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