Type typeIOleObject = this.GetType().GetInterface("IOleObject", true);
                object oleClientSite = typeIOleObject.InvokeMember("GetClientSite",                    
                 BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
                null,
                this,
                null);
                                if (oleClientSite == null)
                {
                    MessageBox.Show("为null");
                    return;
                }                IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite;
                IOleContainer pObj;
                oleClientSite2.GetContainer(out pObj);上面是代码 object oleClientSite = typeIOleObject.InvokeMember("GetClientSite",                    
                 BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
                null,
                this,
                null);这里取的  oleClientSite  为空,取不到。不知道什么问题.
如果别人有好的  ActiveX 与  js交互的代码也可以帖上来 谢谢

解决方案 »

  1.   

    之前做过的一个activeX控件操纵USBKEY的程序
    activeX控件是用C++写的!.net activeX的编写方法网上有,自己baidu吧<OBJECT ID="UsbKey" CLASSID="CLSID:项目里的东西,这里就不写了">
    </OBJECT><script language="javascript" type="text/javascript">
        var lock;
        var lockmsg;
        var isinstall;
        function DetectActiveX() {
            lock = document.getElementById("lock");
            lockmsg = document.getElementById("usbkey_Status");
            document.getElementById("usbcode").value = "";
            try {
                var comActiveX = new ActiveXObject("TestUSBKey.USBKey.1");
                lock.style.background = "url(images/yellow.png) 50% 0 no-repeat";
                lockmsg.innerHTML = "<font color='orange'>请插入USBKey</font>";
                document.getElementById("login_form_Usbkey").style.display = "none";
                isinstall = true;
                getinfo();
            }
            catch (e) {
                isinstall = false;
                lock.style.background = "url(images/red.png) 50% 0 no-repeat";
                lockmsg.innerHTML = "<font color='red'>安全控件未安装,请下载安装</font>";
                document.getElementById("login_form_Usbkey").style.display = "";
            }
            function getinfo() {
            var data = UsbKey.GetContent();//这里是activeX控件里的函数,返回一个string
            if (data != "" && data != "undefined" && data != null) {
                lock.style.background = "url(images/green.png) 50% 0 no-repeat";
                lockmsg.innerHTML = "<font color='green'>USBKey已插入,请输入帐号密码登录</font>";
                document.getElementById("usbcode").value = data;
            } else {
            lock.style.background = "url(images/yellow.png) 50% 0 no-repeat";
            lockmsg.innerHTML = "<font color='orange'>请插入USBKey</font>";
            }    }    }
        </script>
      

  2.   

    c# ActiveX 与 js交互
    还没用过啊,从哪里开始学这些东西啊。
      

  3.   

    to guoyun911谢谢你的代码,但我仔细看了一下你的代码,是  js  操作ocx 控件的。麻烦请看清我的需要。
    要js  调用  ocx  的函数,然后  ocx  的函数要回调  js 函数。谢谢
      

  4.   


    JavaScript调用ActiveX想必大家都很熟悉,这里就不说了。主要说说ActiveX怎么调用JavaScript吧。首先把http://269181927.iteye.com/blog/1045372这篇文章中创建好的修改代码。第一步创建接口[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);
    } 在控件类中添加方法:private void btReaset_Click(object sender, EventArgs e)
    {
       // WebBrowser wb = new WebBrowser();
        //wb.Document.InvokeScript("say", new string[] { "你好!" });
        CallJavaScript("say('你好!')");
    }
     
    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");
        //object script = pDoc2.Script;
     
        //try
        //{
        //    script.GetType().InvokeMember(functionName,
        //    BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
        //    null,
        //    script,
        //    args);
        //}
        //catch { }
    }
       在页面上添加JavaScript方法function say(msg) {
        alert(msg);
    }
      

  5.   

    http://blog.csdn.net/leng_que/article/details/5670754
      

  6.   

    http://www.cnblogs.com/xiaoshatian/archive/2008/09/02/1281786.html