Hata: Visual Studio .NET 2003'te Office olayları iptal parametre yoksayılır.

Makale çevirileri Makale çevirileri
Makale numarası: 830519 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Microsoft Visual Studio .NET 2003 ile çalışırken, Microsoft Word, Microsoft Excel veya Microsoft Outlook tarafından geçirilen bir COM olayı iptal parametresini kullandığınızda sorunlarla karşılaşabilirsiniz. COM olay kodu alır ve kod parametresini uygun biçimde, ayarlayabilirsiniz, ancak COM olay iptal edildi. Bu sorun, COM birlikte çalışabilirlik (örneğin, Microsoft Visual C# veya Microsoft Visual Basic .NET) yönetilen bir istemciden, ve, ayrıca Microsoft .NET Framework sürüm 1.1 kullandığınızda oluşur.

Neden

.NET Framework 1.1 güvenlik değişiklikleri, bir COM bileşeni ile etkileşim, tür güvenliği geliştirmek için sunulan. .NET Framework 1.1 bileşeninin Tür kitaplığında sıralama bilgileri kullanarak, tür güvenliği geliştirir. Word, Excel veya Outlook yönetilen bir istemciden otomatikleştirmek, COM ınterop Assembly (IA) veya Microsoft Office XP Primary ınterop Assembly (PIA) olayları ele almak için Microsoft Office tür kitaplıkları depolanan türü bilgi kullanır. Varolan bir sözcüğü sürümlerini, kitaplıkları, Excel'in tür kitaplıkları ve Outlook'un tür kitaplıkları işareti iptal parametre [,] parametresi olarak yazın. Ortak dil çalıştırma modülünün bu kısıtlamayı zorlar ve gelen çağrıyı verilen bir yönetilen kod tarafından yapılan değişiklikleri engelleyen iptal parametre [,] parametresi olarak işaretlendi. Bu nedenle, olayın bir yönetilen kod IA (veya PIA) iptal edilemez.

Çözüm

Bu hata, Microsoft Office 2003'te giderilmiştir.

Pratik Çözüm

Word, Excel'in önceki bir sürümünde veya Outlook'un önceki bir sürümünü önceki bir sürümünü kullanıyorsanız, yönetilen kodda kendi bağlantı noktası havuzu oluşturmanız gerekir. Özel bir işleyici, tür kitaplığı bağımlılığı ve genellikle uygulanan Zorlanmış türü koruma kurtulabilirsiniz. Bu nedenle, bağımsız değişken, çağrıyı geri geçirilebilir.

Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar; örtülü veya açık garanti vermez. Buna satılabilirlik veya belirli bir amaca uygunluk zımni garantileri de dahildir, ancak bunlarla sınırlı değildir. Bu makale, gösterilen programlama dilini ve yordamları oluşturmak ve hata ayıklamak amacıyla kullanılan araçları kullanmayı bildiğinizi varsayar. Microsoft destek mühendisleri, belirli bir yordamın işlevselliğinin açıklanmasına yardımcı olabilir, ancak gereksinimlerinizi karşılamaya yönelik olarak ek işlevsellik sağlamak veya yordamlar geliştirmek amacıyla bu örnekleri değiştirmezler.

Bir yardımcı sınıf oluşturma

Visual C# gelen olayların doğrudan batar için <a0></a0>, kendi görüntüleme arabirimi tanımı oluşturun ve olay kodunuzu uygulamak için bir yardımcı sınıf oluşturmanız gerekir. Görüntüleme arabirimi tanımı, genel benzersiz tanımlayıcı (GUID) ve olayları batar istediğiniz Office nesne tarafından beklenen olay havuzunu gönderme tanımlayıcıları (DISPIDs) eşleşmelidir. Bu değerler ne olduğunu bulmak için <a0></a0>, aşağıdaki yöntemlerden birini kullanabilirsiniz:
  • Visual Studio .NET 2003 Professional Edition ile gelen OLE/COM nesnesi görüntüleyiciyi kullanabilirsiniz.
  • Platform SDK'yı kullanabilirsiniz. Platform SDK hakkında ek bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:

    http://www.microsoft.com/msdownload/platformsdk/sdkupdate
GUID ve DISPIDs tanıdığınız sonra kendi Visual Basic. NET'te veya Visual C# içinde görüntüleme arabirimi tanımının tanımı oluşturabilirsiniz.

Bu makalede, özel bir bağlantının nasıl kullanacağınızı gösteren iki örnek de, bu soruna geçici bir çözüm bulmak için işaret sağlar. Ilk örnekte, Word 2000 için Uygulama nesnesi olayları batar ve böylece kullanıcı bir belgeyi kapatamazsınız DocumentBeforeClose olayı iptal etmek gösterilmiştir. Ikinci örnek Outlook 2002'de, ItemSend olay havuzlarını, böylece uygulamanızda gönderme işlemi iptal edebilirsiniz.

Örnek 1: iptal DocumentBeforeClose olayı

  1. Visual Studio .NET 2003 başlatın. Yeni bir proje başlatın. Seçim Visual C# projesi türü. Seçin Windows uygulama şablonu olarak. Projeyi MyWordEventTest ve sonra Tamam ' ı tıklatın.

    Varsayılan olarak, Form1 oluşturulur.
  2. Proje menüsünde Add Reference. Iletişim kutusunda Microsoft 9.0 Nesne Kitaplığı Word COM sekmesinde bir başvuru eklemek için Seç ' i tıklatın ve sonra iletişim kutusunu kapatmak için Tamam ' ı tıklatın.

    Özel bir IA sizin için otomatik olarak oluşturulur.
  3. Proje menüsünde, <a1>Ekle</a1> bir sınıf'ı tıklatın. Kod dosyası seçin ve sonra da sınıf adı Word9EventHelper.cs. Dosyayı oluşturmak için Tamam ' ı tıklatın.
  4. Kod penceresinde 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. Form1'e geri geçiş yapmak ve bir komut düğmesi ekleyin. Kod penceresine Form1.cs için görünür yapmak için komut düğmesini çift tıklatın. Ya da kodu Form1.cs kod penceresine görünür yapmak için Görünüm menüsünden'ı tıklatın. Aşağıdaki kodu için tıklatarak 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. Düğme işleyicisi önce <a2>Form1</a2> sınıfı için aşağıdaki kodu ekleyin:
    Word.Application m_oApp;
    WordAppEvents9.WordAppEventHelper m_oAppEvents;
    
  7. Oluştur) menüsünde tıklatın Build Solution proje yapmak. Debug ' ı tıklatın ve sonra da <a2>uygulamayı çalıştırmak için Başlat</a2>'ı tıklatın.

    Uygulama başlatıldığında, komut düğmesini tıklatabilir ve sonra Word görüntülenir. Uygulamanızın kapatana kadar Word penceresi kapatılamıyor.

    Excel'in olayları işlemek için benzer bir kod kullanabilirsiniz.

Örnek 2: ItemSend iptal olayı

  1. Visual Studio .NET 2003 başlatın. Yeni bir proje başlatın. Seçim Visual C# projesi türü. Seçin Windows uygulama şablonu olarak. Projeyi MyOutlookEventTest ve sonra Tamam ' ı tıklatın.

    Varsayılan olarak, Form1 oluşturulur.
  2. Proje menüsünde Add Reference. Iletişim kutusunda Microsoft Outlook 10.0 Nesne Kitaplığı COM sekmesinde bir başvuru eklemek için Seç ' i tıklatın ve sonra iletişim kutusunu kapatmak için Tamam ' ı tıklatın.

    Özel bir IA sizin için otomatik olarak oluşturulur.
  3. Proje menüsünde, <a1>Ekle</a1> bir sınıf'ı tıklatın. Kod dosyası seçin ve sonra da sınıf adı Outlook10EventHelper.cs. Dosyayı oluşturmak için Tamam ' ı tıklatın.
  4. Aşağıdaki kodu için 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. Aksi halde, olayı iptal edilemiyor.
  5. Form1'e geri geçiş yapmak ve bir komut düğmesi ekleyin. Kod penceresine Form1.cs için görünür yapmak için komut düğmesini çift tıklatın. Ya da kodu Form1.cs kod penceresine görünür yapmak için Görünüm menüsünden'ı tıklatın. Varsa tıklatın 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. Düğme işleyicisi önce <a2>Form1</a2> sınıfı için aşağıdaki kodu ekleyin:
    Outlook.Application m_oApp;
    OutlookAppEvents10.OutlookAppEventHelper m_oAppEvents;
    
  7. Oluştur) menüsünde tıklatın Build Solution proje yapmak. Debug ' ı tıklatın ve sonra da <a2>uygulamayı çalıştırmak için Başlat</a2>'ı tıklatın.

    Uygulama başladığında, komut düğmesini tıklatabilir ve sonra Outlook'u görünür. Yeni e-posta taslağı otomatik olarak oluşturulur. Bir alıcı için satırdaki giriş ve sonra da <a2>Gönder</a2>'i tıklatın. Bir pop ItemSend olayı iptal etmek isteyip istemediğinizi soran bir iletişim kurma alırsınız. ' ı tıklatın, iptal etmek için Evet.

    Excel'in olayları işlemek için benzer bir kod kullanabilirsiniz.

Durum

Microsoft bu sorunun "Aşağıdakilere Uygulanır" bölümünde listelenen Microsoft ürünlerinde bulunduğunu onaylamıştır.

Referanslar

Visual Studio'nun Office'ten otomatikleştirme hakkında ek bilgi için .NET Microsoft Knowledge Base'deki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
311452Visual Studio .NET ile Microsoft Office çözümleri geliştirme (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)
317109Office uygulaması Visual Studio. NET'in istemciden Otomasyon sonra çıkın

Özellikler

Makale numarası: 830519 - Last Review: 27 Şubat 2014 Perşembe - Gözden geçirme: 3.5
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbnofix kbbug KB830519 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir: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