C++类型和C#类型的Activex控件编写并测试详细说明

本文介绍如何使用C++与C#开发Activex控件,并详细阐述了在Visual Studio 2010环境下创建控件、添加方法及实现回调JS的功能。提供了从创建工程到注册控件的全过程指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++和C#开发Activex控件总结

开发环境:VS2010  IE11

1.  C++篇

1.1        创建工程

如下图示,创建”MFC Activex控件”类型的工程

 

1.2         查看OCX GUID

按照如下步骤即可得到OCX的GUID

 

1.3        添加ocx外部调用方法

1.3.1   如下图显示步骤进行方法添加

 

 

 

 

 

1.4 添加回调JS的外部方法

1.4.1 按照如下图示进行方法添加

 

1.4.2 ocx回调JS函数

# OCX普通回调

# OCX 线程回调

1. ocx项目中自定义消息:

 #defineWM_THREADFIREEVENT(WM_USER+101)

2.      定义静态成员变量

staticCCppActivexCtrl*m_pThis;

3.      CppActivexCtrl.h中增加消息声明

LRESULTOnFireEventForThread(WPARAMwParam,LPARAMlParam);

4. CppActivexCtrl.cpp中增加消息映射和函数数实现

ON_MESSAGE(WM_THREADFIREEVENT,OnFireEventForThread)

 

LRESULTCCppActivexCtrl::OnFireEventForThread(WPARAMwParam,LPARAMlParam)

{

   m_pThis->CallJsFun(1024, _T(OCX 回调JS方法));

   returnTRUE;

}

5. 调用

::PostMessage(m_hWnd,WM_THREADFIREEVENT,(WPARAM)NULL,(LPARAM)NULL);

6.回调函数

voidCCppActivexCtrl::CallJsFun(LONGlPar,LPCTSTRstrFirst)

{

   AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

   // TODO:  在此添加调度处理程序代码

   FireEvent(dispidCallJsFun,EVENT_PARAM(VTS_I4  VTS_BSTR),lPar,strFirst);

}

7. 网页中回调如下

<script language="javascript"for="CppOcxId" event="CallJsFun(p1, p2)"type="text/javascript">

         alert("发现回调:" +p1 + "  " + p2);

</script>

8. 完整页面调用举例

<html> 

<head>

<meta charset="GB2312" />

<styletype="text/css"> 

div { 

 <!-- width:100%;

 height:500; -->

 border:1px solid #666; 

 overflow:hidden; 

  position:relative; 

 display:table-cell; 

 <!-- text-align:center;  -->

 vertical-align:middle; 

 overflow:auto;

p {  

 display:inline-block;

 } 

* { margin:0; padding:0;} 

#fsel{

         width:500;

}

center{

          position: relative;

}

input{

          position: relative;

}

 

html,body {

width:100%;

height:100%;

margin:0px;

padding:0px;

overflow:hidden;

}

 

#txt{

         float:left;

         width:80%;

         height:100%;

         border:1pxsolid #666;

         overflow:auto;

    }

</style> 

 

<script type="text/javascript"language="javascript"> 

         varcppOcx = null;

         window.onload= function(){

                   try{   

                            varcppOcx = document.getElementById("CppOcxId"); 

                   }catch(e) 

       { 

           alert(e); 

       }

         }

         functionAbout(){

                   try{   

                            cppOcx= document.getElementById("CppOcxId"); 

                            cppOcx.AboutBox();

                   }catch(e) 

       { 

           alert(e); 

       }

         }

         functionUseCppOcxFun(){

                   try{ 

                            cppOcx= document.getElementById("CppOcxId"); 

                            //cppOcx.TestFun1(999,"何世阳");

                            cppOcx.UseFunc();

                   }catch(e){

                            alert(e);

                   }

         }

         functionUseJsFun(){

                   try{ 

                            cppOcx= document.getElementById("CppOcxId"); 

                            //cppOcx.TestFun2();

                   }catch(e){

                            alert(e);

                   }

         }

        

</script>

 

<script language="javascript"for="CppOcxId" event="CallJsFun(p1, p2)"type="text/javascript">

         alert(888);

         alert("发现回调:" +p1 + "  " + p2);

</script>

 

<title>CPP ocx控件测试</title> 

</head> 

<body>  

         <divid="txt" class="chat"scrollTop="scrollHeight"> 

         </div>

         <div>

 

                   <br/> 

                   <br/>

                   <br/> 

                   <br/>

 

                   <objectclassid="clsid:E26F6F19-7CA8-4992-9BAA-65D799E1C474"codebase="CppActivexSecond.ocx" id="CppOcxId"width="0" height="0" > 

                   </object>

                   <!--

                   <objectclassid="clsid:F17BACD7-6A7C-428C-8BBA-C1FCA172C6BA"codebase="UnisoundWrsSdk.ocx" id="WrsTest"width="0" height="0" > 

                   </object>

                   -->

                   <br/> 

                   <br/> 

                  

                   <inputtype="button" value="产看版本信息"onclick="About();" /> 

                   <br/>

                   <br/>

                   <inputtype="button" value="调用CPP OCX方法"onclick="UseCppOcxFun();" />

                   <br/>

                   <br/>

                   <inputtype="button" value="回调JS方法"onclick="UseJsFun(); " />

 

         </div>

</body>

</script>

         <scriptsrc="jquery.js">

</script> 

</html>

2. C#篇

2.1 创建工程

如下图示,创建如下图示工程:

 

2. 设置工程属性

 

 

 

 

2.2 查看OCX GUID

 

2.3 修改文件AssemblyInfo.cs

1. 增加

//新添加下面的属性。该属性要求引用System.Security

[assembly: AllowPartiallyTrustedCallers()]

2. 注释

//如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID

[assembly: Guid("59d0d655-be20-429b-8843-f6e1c0249248")]

4.      添加引用

usingSystem.Security;

如下图示:

5.      增加接口

[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

publicinterfaceIObjectSafety

{

    voidGetInterfacceSafyOptions(System.Int32riid, outSystem.Int32pdwSupportedOptions, outSystem.Int32pdwEnabledOptions);

    voidSetInterfaceSafetyOptions(System.Int32riid, System.Int32dwOptionsSetMask, System.Int32dwEnabledOptions);

}、

如下图示:

 

 

 

2.4 创建ocx控件

 

 

 

 

2.5 修改文件UserControlOcx.cs

1. 添加如下引用

usingSystem.Security;

usingSystem.Runtime.InteropServices;     //必须引用该包

 

2. 将2.3步骤中注释的Guid放在类开头

如下图示:

 

 

2.6 注册ocx控件

C:\Windows\Microsoft.NET\Framework\v4.0.30319>RegAsm.exeD:\work\分享\CPP_C#_OCX

开发\OcxProject\OcxDev\CsharpActivex\bin\Debug\CsharpActivex.dll

2.7 回调JS方法

引入模块:Microsoft.mshtml.dll

 

 

 

 

UserControlOcx.cs文件中增加如下引用:

 

 

 

 

 

附:测试代码如下:

<!DOCTYPE html>

<html>

<head lang="en">

   <meta charset="UTF-8">

   <title></title>

         <scripttype="text/javascript" language="javascript">

                   functionUseOcx(){

                            varcspOcx = document.getElementById("csharpocx");

                            cspOcx.UseOcx();

                   }

         </script>

</head>

<body>

   <div>

       <OBJECT ID="csharpocx"CLASSID="CLSID:59d0d655-be20-429b-8843-f6e1c0249248"></OBJECT>

   </div>

         <div>

                   <inputtype="button" value="调用C#类型OCX"onclick="UseOcx();/>

         </div>

</body>

</html>

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值