Microsoft Visual Studio .NET 2005 編寫自己的ActiveX
由於最近一個Web專案要用到視訊影象採集,沒有很合適的成型控制元件使用,就只能硬著頭皮自己寫了,當然VC++或者VB都可以做ActiveX,可是自己又不會VC++,VB也僅停留在讀懂的基礎上,所以就只能用C#來實現了,雖然這樣一來客戶端需要安裝.net framework,但是專案不等人,現在就動手。
第一步:新建一個解決方案 demoSolution,新增一個Windows控制元件庫專案,我們起名為demoActiveX。為便於閱讀,我們更改控制元件名字為demoControl.cs,然後拖動一個textBox控制元件到窗體上。
第二步:在demoControl類下新建公共方法Test,用於實現控制元件與客戶端指令碼的互操作,
public void Test()
{
MessageBox.Show("你輸入的內容為:" + this.textBox1.Text);
}
第三步:開啟AssemblyInfo.cs修改程式集資訊。引用System.Security名稱空間,並新增[assembly : AllowPartiallyTrustedCallers()]安全宣告,修改[assembly: ComVisible(false)]為[assembly: ComVisible(true)]使程式集Com可見。
第四步:為Com Interop註冊。右鍵demoActiveX專案屬性,在“生成”選項卡里將“為Com Interop註冊”打上勾即可。
第五步:在demoActiveX中新增名稱空間System.Runtime.InteropServices,使用工具->建立 Guid工具建立一個新的Guid{E5FD041B-8250-4cbc-B662-A73FC7988FB5},用該Guid初始化demoActiveX,該Guid即是我們要在Web頁面下引用該ActiveX的classid 。
第六步:實現IObjectSafety介面,把ActiveX控制元件標記為安全的。
介面:
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
// methods
void GetInterfacceSafyOptions(
System.Int32 riid,
out System.Int32 pdwSupportedOptions,
out System.Int32 pdwEnabledOptions);
void SetInterfaceSafetyOptions(
System.Int32 riid,
System.Int32 dwOptionsSetMask,
System.Int32 dwEnabledOptions);
}
實現:
public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
{
// TODO: 新增 demoControl.GetInterfacceSafyOptions 實現
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
{
// TODO: 新增 demoControl.SetInterfaceSafetyOptions 實現
}
到現在為止整個程式已經完成,下一步我們需要做的就是如何釋出這個ActiveX
第七步:釋出。新增新Windows安裝專案 winsetup 新增專案主輸出,然後,改動ActiveX控制元件的主輸出檔案,將其Register屬性改為vsdrpCOM,很遺憾的是,安裝URL中必須使用絕對路徑,不能使用相對路徑。這意味著生成安裝程式的時候就必須確定路徑,不是很方便。在示例中,我使用了
然後生成安裝程式,並把setup.exe及winsetup.msi拷貝到虛擬目錄demoActiveX下。/第八步:測試。編寫一個htm頁面以供測試,需要注意一點,我們在object塊中加入了codebase屬性程式碼,用於指定下載控制元件的位置。參考下面程式碼檔案。
第九步:簽名,這個就不多說了,到網上申請一個即可。
demoActiveX.cs程式碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace demoActiveX
{
[Guid("E5FD041B-8250-4cbc-B662-A73FC7988FB5")]
public partial class demoControl : UserControl, IObjectSafety
{
public demoControl()
{
InitializeComponent();
}
public void Test()
{
MessageBox.Show("你輸入的內容為:" + this.textBox1.Text);
}
public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
{
// TODO: 新增 demoControl.GetInterfacceSafyOptions 實現
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
{
// TODO: 新增 demoControl.SetInterfaceSafetyOptions 實現
}
}
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
// methods
void GetInterfacceSafyOptions(
System.Int32 riid,
out System.Int32 pdwSupportedOptions,
out System.Int32 pdwEnabledOptions);
void SetInterfaceSafetyOptions(
System.Int32 riid,
System.Int32 dwOptionsSetMask,
System.Int32 dwEnabledOptions);
}
}
test.htm程式碼:
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
</head>
<body>
<form id="form1">
<table>
<tr>
<td align="center">
<object id="demoActiveX"
classid="clsid:E5FD041B-8250-4cbc-B662-A73FC7988FB5" codebase="Setup.exe" Width="200" Height="100">
</object>
</td>
</tr>
<tr>
<td align="center">
<input type=button id="Button1" value="測試" onclick="javascript:doTest()">
</td>
</tr>
</table>
<script>
function doTest()
{
var obj = document.getElementById("demoActiveX");
obj.Test();
}
</script>
</form>
</body>
</html>