shouchengcheng
just do it

C#-activity控件

C#-Acitvity控件

这段时间都在弄2.4G有源RFID,基本硬件选用的是TI的CC2500为RF,MSP430F2274为MCU,主要原因是低功耗,还有就是资料多。

由于系统是采用B/S架构的,网页要访问本地,所以只能通过JS调用Activity控件来实现。RFID读写器是通过串口的形式和PC机相连的,本来直接调用MSCOM的OCX就好了的。但是JS无法读取MSCOM的二进制流,只能读取字符串,而读写器传过来的不是字符串,所以就悲剧了。加上开发无线协议栈的博士认为,读写器这边把数据改成字符串会影响通信稳定性,所以不改。没有办法只能自己写一个Activity控件。

小弟我对这个不熟所以首先是问度娘,果然找到好多如何制作Activity控件的教程。于是我一个个试过去。基本上按部就班。记录步骤,备忘。

参照的是艺林博客中的一片博文。

1、创建C#工程,选择类库。 2、为了让Activity控件获得客户端的信任,控件类要实现一个不、名为“IObjectSafety”。需要新建一个“Visual C#类”,在namespace中添加如下代码(注意:此段代码是固定的)

 1 [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
 2 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 3 public interface IObjectSafety
 4 {
 5     [PreserveSig]
 6     int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwS
 7     upportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
 8     [PreserveSig()]
 9     int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOption
10     SetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
11 }

 

然后添加控件基类

 1 public abstract class ActiveXControl : IObjectSafety
 2 {
 3     #region IObjectSafety 成员
 4     private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
 5     private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
 6     private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
 7     private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
 8     private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB
 9     851}";
10     private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
11     private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
12     private const int S_OK = 0;
13     private const int E_FAIL = unchecked((int)0x80004005);
14     private const int E_NOINTERFACE = unchecked((int)0x80004002);
15     private bool _fSafeForScripting = true;
16     private bool _fSafeForInitializing = true;
17     public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pd
18     wEnabledOptions)
19     {
20         int Rslt = E_FAIL;
21         string strGUID = riid.ToString("B");
22         pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFA
23         CESAFE_FOR_UNTRUSTED_DATA;
24         switch (strGUID)
25         {
26             case _IID_IDispatch:
27             case _IID_IDispatchEx:
28                 Rslt = S_OK;
29                 pdwEnabledOptions = 0;
30                 if (_fSafeForScripting == true)
31                     pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
32                 break;
33             case _IID_IPersistStorage:
34             case _IID_IPersistStream:
35             case _IID_IPersistPropertyBag:
36                 Rslt = S_OK;
37                 pdwEnabledOptions = 0;
38                 if (_fSafeForInitializing == true)
39                     pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
40                     break;
41             default:
42                 Rslt = E_NOINTERFACE;
43                 break;
44         }
45         return Rslt;
46     }
47     public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOpt
48     ions)
49     {
50         int Rslt = E_FAIL;
51         string strGUID = riid.ToString("B");
52         switch (strGUID)
53         {
54             case _IID_IDispatch:
55             case _IID_IDispatchEx:
56                 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UN
57                 TRUSTED_CALLER) &&
58                 (_fSafeForScripting == true))
59                     Rslt = S_OK;
60                 break;
61             case _IID_IPersistStorage:
62             case _IID_IPersistStream:
63             case _IID_IPersistPropertyBag:
64                 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UN
65                 TRUSTED_DATA) &&
66                 (_fSafeForInitializing == true))
67                     Rslt = S_OK;
68                 break;
69             default:
70                 Rslt = E_NOINTERFACE;
71                 break;
72         }
73         return Rslt;
74     }
75     #endregion
76 }

 

最后就是控件类

1 [Guid("ID号")]   //此处的ID号和以后JS调用的ID号一一对应
2 public class 类名:控件基类名
3 {
4     //里面的函数就是JS中调用到的函数等等
5 }

 

3、添加“安装项目”工程,这个是用来生成exe安装文件的。在这个工程里,可以选择.NET Framework等等。

注意事项:

在函数中要多写try-catch。

不要以JS中的关键字命名函数。

可以先在C# Windows窗口程序中进行单步调试,稳定之后再部署。

 

posted on 2013-12-23 16:09  shouchengcheng  阅读(435)  评论(0编辑  收藏  举报