文件名称:
C#版ActiveX + JS +Flex通讯 完整实现
开发工具:
文件大小: 695kb
下载次数: 0
上传时间: 2009-11-06
详细说明: C#版ActiveX + JS +Flex通訊 全實現 因項目部署需要,特把之前寫的與讀卡器通訊的模塊改為ActiveX插件,給Flash調用,由於Flash不能直接調用ActiveX,所以,用JS作為中間層,作為Flash和ActiveX通訊的橋梁。 開發環境:WINXP _EN 開發工具:VS2005,Flex 3. .net 2.0 ActiveX控件開發 1:新建一個工程項目,MyActiveXDemo,選擇Visual C#->Windows Control Library 2 :修改UserControl1.cs為ReadICCard.cs 3:設置工程發布屬性,工程屬性->Application->Assembly information, 把Make assembly Com-Visible 勾上。 4:到 工程屬性->Build->Output, 把 Register for COM interop 勾上。 5:修改AssemblyInfo.cs文件,加上紅色方框部分內容: 6:在ReadICCardActiveX 控件里,添加一個GUID,可以使用 工具-创建GUID 菜单创建一个GUID 7:为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值):(這里是直接copy網上的) using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Preresearch.CSharpActiveX { [ComImport, GuidAttribute( " CB5BDC81-93C1-11CF-8F20-00805F2CD064 " )] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IObjectSafety { [PreserveSig] int GetInterfaceSafetyOptions( ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); [PreserveSig()] int SetInterfaceSafetyOptions( ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); } } 然后在控件类中继承并实现该接口: #region IObjectSafety 成员 private const string _IID_IDispatch = " {00020400-0000-0000-C000-000000000046} " ; private const string _IID_IDispatchEx = " {a6ef9860-c720-11d0-9337-00a0c90dcaa9} " ; private const string _IID_IPersistStorage = " {0000010A-0000-0000-C000-000000000046} " ; private const string _IID_IPersistStream = " {00000109-0000-0000-C000-000000000046} " ; private const string _IID_IPersistPropertyBag = " {37D84F60-42CB-11CE-8135-00AA004BB851} " ; private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001 ; private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002 ; private const int S_OK = 0 ; private const int E_FAIL = unchecked (( int ) 0x80004005 ); private const int E_NOINTERFACE = unchecked (( int ) 0x80004002 ); private bool _fSafeForScripting = true ; private bool _fSafeForInitializing = true ; public int GetInterfaceSafetyOptions( ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions) { int Rslt = E_FAIL; string strGUID = riid.ToString( " B " ); pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; switch (strGUID) { case _IID_IDispatch: case _IID_IDispatchEx: Rslt = S_OK; pdwEnabledOptions = 0 ; if (_fSafeForScripting == true ) pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER; break ; case _IID_IPersistStorage: case _IID_IPersistStream: case _IID_IPersistPropertyBag: Rslt = S_OK; pdwEnabledOptions = 0 ; if (_fSafeForInitializing == true ) pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA; break ; default : Rslt = E_NOINTERFACE; break ; } return Rslt; } public int SetInterfaceSafetyOptions( ref Guid riid, int dwOptionSetMask, int dwEnabledOptions) { int Rslt = E_FAIL; string strGUID = riid.ToString( " B " ); switch (strGUID) { case _IID_IDispatch: case _IID_IDispatchEx: if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true )) Rslt = S_OK; break ; case _IID_IPersistStorage: case _IID_IPersistStream: case _IID_IPersistPropertyBag: if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true )) Rslt = S_OK; break ; default : Rslt = E_NOINTERFACE; break ; } return Rslt; } #endregion 8:在控件里寫業務流程,這個和常規的winform一樣。 9:添加與JS交互代碼(Copy 網上的),這個函數必須要在IE7以上才能調用。 #region CallJavaScript 成员 private void CallJavaScript(string code) { Type typeIOleObject = this.GetType().GetInterface("IOleObject", true); object oleClientSite = typeIOleObject.InvokeMember("GetClientSite", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, this, null); IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite; IOleContainer pObj; oleClientSite2.GetContainer(out pObj); //获取页面的Script集合 IHTMLDocument2 pDoc2 = (IHTMLDocument2)pObj; IHTMLWindow2 win2 = (IHTMLWindow2)pDoc2.parentWindow; win2.execScript(code, "javascript"); } [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); } [ComImport, Guid("00000118-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IOleClientSite { void SaveObject(); void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk); void GetContainer(out IOleContainer ppContainer); void ShowObject(); void OnShowWindow(bool fShow); void RequestNewObjectLayout(); } [ComImport, Guid("0000011B-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IOleContainer { void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags, [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum); void ParseDisplayName([In, MarshalAs(UnmanagedType.Interface)] object pbc, [In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName, [Out, MarshalAs(UnmanagedType.LPArray)] int[] pchEaten, [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut); void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock); } #endregion 10:調用JS CallJavaScript("getMsgFromActiveX('" + strEvent + "','" + strContent + "')"); GetMsgFromActiveX: JS里的函數名 strEvent,strContent:參數 注意,如果你需要在ActiveX里有線程操作的,請用代理來完成調用,否則出錯。 11:一切就緒,編譯運行,你可以在UserControl TestContainer里調試你的業務方法。 到這裡位置,ActiveX編碼完成,接下來就發布。 ActiveX控件部署 1:使用VS新建一個ActiveX安裝包 2:選擇工程類型。Other Project Types->Setup and Deployment->Setup Project 3:添加主輸出目錄 4:點了OK后,就會出現以下畫面,要保證Register属性为vsdrpCOM 5:Build it..你會在Folder下看到 到此位置,控件打包完畢。 ActiveX控件的調用 1:加載: 2:調用ActiveX方法 3:編寫JS, ActiveX回調函數,這個函數結構一定要和ActiveX里的一致。 好了,大功告成,安裝ActiveX插件,然後在瀏覽器上訪問剛剛那個頁面,就work的了。如果發現沒反應,請檢查你本機的一些安全設置及第三方安全軟件的設置。 Flex與JS交互 由於比較簡單,請直接看代碼就可以了。JS我是直接寫到發布的html文件。這樣管理起來方便點。 ->發布證書 ->打包成Cab 這連個 等我有時間的時候補上。 ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.