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

被折叠的 条评论
为什么被折叠?



