如何: 接收 Managed 的 C# 事件在 Internet Explorer 的指令碼

文章翻譯 文章翻譯
文章編號: 313891 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您如何從元件物件模型 (COM) 用戶端 (Unmanaged 程式碼) 接收 Managed 的事件當您撰寫.NET Windows 控制項。比方說您 Managed 從接收事件的 COM 用戶端在 Internet Explorer 中執行指令碼時。

如何撰寫,以及使用來自 COM 的 Managed 型別資訊,請參照下列 Microsoft.NET Framework 開發人員指南 》 文件:
公開至 COM 的.NET Framework 元件
http://msdn2.microsoft.com/en-us/library/zsfww439(vs.71).aspx

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Microsoft Visual Studio.NET
  • Microsoft Internet Explorer 5.5 或更新版本程式設計

接收器 Managed 的事件在 Internet Explorer 指令碼中的步驟

  1. 建立自訂的 Windows Form 控制項:
    1. 啟動 Microsoft Visual Studio.NET。
    2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
    3. 在 [新增專案] 對話方塊按一下 [專案類型,] 下的 [Visual C# 專案,然後再按一下 [範本] 下方的 [Windows 控制項程式庫
  2. 定義來源介面公開事件。
  3. GuidAttribute 類別加入至來源介面。您必須格式化您傳遞給屬性當做可接受的建構函式引數型別的 GUID 字串。您可以使用 Guidgen.exe 檔案來建立未使用的 GUID
    [GuidAttribute("0422D916-C11A-474e-947D-45A107038D12") ]
        
        public interface ControlEvents 
    
    		
        {
            //  Insert code here.
        }
    					
  4. 新增來源介面公開 (Expose) 為 IDispatch 介面的 COM InterfaceType 屬性:
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
        public interface ControlEvents 
    
    		
        {
           
            // Insert code here.
        }
    					
  5. 新增至來源介面中來指定 COM 分派識別碼 (DISPID) 方法或欄位的任何成員的 DispIdAttribute
    public interface ControlEvents 
    	
        {
            [DispIdAttribute(0x60020000)]
            void ClickEvent(int x, int y);
        }
    					
  6. 建立新的事件類型,以包裝所要的事件,公開 (Expose)。
  7. 自訂的 Windows Form 控制項上實作來源介面。
  8. 識別介面公開為 COM 事件來源的清單控制項中加入 ComSourceInterfaces 屬性:
    [ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(ControlEvents))]
    	public class MyWindowControl : System.Windows.Forms.UserControl 
        {
    
          // Insert code here.
        }
    					
  9. 將控制項編譯為動態連結程式庫 (DLL) 檔案。
  10. 在 HTML 網頁來連結事件上建立指令碼區塊。例如:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=iso-8859-1' />
    
    <HTML>
    	<HEAD>
    		<TITLE>Sink managed event in Internet Explorer</TITLE>
    		
    		
    	</HEAD>
    	
    	<BODY>
    		
    		<OBJECT id="ctrl" classid="YourDllName.dll#ActiveXSourcing.MyWindowControl">
    		</OBJECT>
    		<SCRIPT LANGUAGE="JScript">
                function ctrl::ClickEvent(a,b)
                {
                    alert("MyWindowControl_ClickEvent");
                }
    		</SCRIPT>
    		
    	</BODY>
    </HTML>
    					
  11. 在任何的用戶端系統上使用.NET Framework 組態工具 (Mscorcfg.msc) 授與組件個別所需的權限。

完成程式碼清單

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace ActiveXSourcing
{
	public delegate void ClickEventHandler(int x, int y); 

	//Source interface for events to be exposed.
	//Add GuidAttribute to the source interface to supply an explicit System.Guid.
	//Add InterfaceTypeAttribute to indicate that interface is IDispatch interface.
	[GuidAttribute("0422D916-C11A-474e-947D-45A107038D12") ]
	[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
	public interface ControlEvents 

		//Add a DisIdAttribute to any members in the source 
		//interface to specify the COM DispId.
	{
		[DispIdAttribute(0x60020000)]
		void ClickEvent(int x, int y);
	}

	//Add a ComSourceInterfaces attribute to the control to 
	//identify the list of interfaces that are exposed as COM event sources. 
	[ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(ControlEvents))]
	public class MyWindowControl : System.Windows.Forms.UserControl 
		//, ComInteropControlInterface
	{
        System.Windows.Forms.TextBox tx = new TextBox();

		private void InitializeComponent()
		{
			
			this.Name = "MyWindowControl";

		}
	
		event ActiveXSourcing.ClickEventHandler ClickEvent;
    	
		public MyWindowControl() : base()
		{				               

			initMyWindowControl();

		}
        
		private void initMyWindowControl() 
		{

			Size = new System.Drawing.Size(300, 50);
			tx.Text = "Click on the TextBox to invoke  'ClickEvent'";
			tx.Size = this.Size;                  
			tx.Click += new System.EventHandler(ClickHandler);
			this.Controls.Add(tx);
			
		}
            
        
		private void ClickHandler(object sender, System.EventArgs e)
		{
			if (ClickEvent != null) 
			{
				ClickEvent(0, 0);
			}
		}
	}
}
				

?考

如需詳細資訊,請參閱以下列 Microsoft 網站:
處理和引發事件
http://msdn2.microsoft.com/en-us/library/edzehd2t(vs.71).aspx

.NET 架構組態工具 (Mscorcfg.msc)
http://msdn2.microsoft.com/en-us/library/2bc0cxhc(vs.71).aspx

Unmanaged 程式碼與互通
http://msdn2.microsoft.com/en-us/library/sd10k43k(vs.71).aspx

在 Microsoft Internet Explorer 中主安全、 輕量級用戶端控制項
http://msdn.microsoft.com/msdnmag/issues/02/01/UserCtrl/default.aspx
如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
316510注意: 安全性例外狀況在 Internet Explorer 中使用事件處理常式時

屬性

文章編號: 313891 - 上次校閱: 2007年5月17日 - 版次: 3.4
這篇文章中的資訊適用於:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Internet Explorer 5.5
關鍵字:?
kbmt kbcominterop kbhowto kbhowtomaster kbsample KB313891 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:313891
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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