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窗口程序中进行单步调试,稳定之后再部署。