1.引用Microsoft.mshtml
Microsoft.mshtml的路径是C:/Program Files/Microsoft.NET/Primary Interop Assemblies/Microsoft.mshtml.dll,添加引用后在ActiveX对应类中编写:
- <strong>using</strong> mshtml;
2.用c#实现两个COM类,IOleClientSite和IOleContainer
- <strong><textarea cols="50" rows="15" name="code" class="c-sharp">using System.Runtime.InteropServices;
- [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,
- [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);
- }</textarea> </strong>
3.调用JavaScript方法
在Activex控件的对应类中就可以编写如下的CallJavaScript方法:
- <strong><textarea cols="50" rows="15" name="code" class="c-sharp">private void CallJavaScript(string Filenames)
- {
- 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);
- //参数数组
- object[] args = new object[1];
- args[0] = Filenames;
- //获取页面的Script集合
- IHTMLDocument pDoc2 = (IHTMLDocument) pObj;
- object script = pDoc2.Script;
- try
- {
- //调用JavaScript方法OnScaned并传递参数,因为此方法可能并没有在页面中实现,所以要进行异常处理
- script.GetType().InvokeMember("OnScaned",
- BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
- null,
- script,
- args);
- }
- catch { }
- }</textarea> </strong>
4.在页面中实现相应的JavaScript方法
在包含这个ActiveX控件的页面中添加如下的JavaScript方法:
- <strong><textarea cols="50" rows="15" name="code" class="javascript"><mce:script type="text/javascript"><!--
- function OnScaned(files)
- {
- if (files)
- {
- //do something
- }
- }
- // --></mce:script></textarea> </strong>
这样,在ActiveX控件中调用CallJavaScript方法时,最终就会调用到页面中的OnScaned方法,藉此实现了ActiveX的“事件”机制。