VC 制作ActiveX 控件(OCX)

C/C++ 专栏收录该内容
20 篇文章 0 订阅
1、vc6下建立一下activeX工程
详见【[url=http://hi.baidu.com/mailrabbit/blog/item/0624a608bde798346b60fbb6.html]http://hi.baidu.com/mailrabbit/blog/item/0624a608bde798346b60fbb6.html[/url]】
2、在页面中调用
2.1:注册ocx到系统([url=http://ileson.iteye.com/blog/1982621]也可以这样[/url])
 regsvr32 E:\ocx\test.ocx

2.2找到classid
有几种方法:
①、VC--》菜单栏中的“工具”--》OEL/COM Object viewer--》Object Classes--》All Objects --》找到对应的OCX名称,找到例如 如下值:clsid={96E5CC6E-18BD-43DA-B564-2EAB9F282C76}=XNPOS Control
②、在注册表里找,其实上面的工具,也是从注册表里提取的。。。
cmd->regedit-> ctrl+f 输入你的ocx名称
③、其实在工程文件里,有个odl文件。。最后一行的clsid 就是。。。

2.3页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script type="text/javascript" language="javascript">
/**
*测试OCX
*/
function testOCX(){
alert("进入");
var ocx=document.getElementById("pos");
alert(ocx);
var t=ocx.test(1,2);
alert(t);
}
</script>
</head>

<body>
<!--clsid : 如果控件成功注册到本机后,这个值在本机注册表中可以找到,js获取控件对象就是通过这个来找的。-->
<OBJECT name="xn_pos" ID="pos" WIDTH="0" HEIGHT="0" CLASSID="CLSID:96E5CC6E-18BD-43DA-B564-2EAB9F282C76" codebase="xnpos.ocx"></OBJECT>

<input type="button" value="测试OCX" onclick="testOCX();" />
</body>
</html>

[color=blue]3、过程中遇到的一些问题[/color]
3.1、xxx.odl 中支持boolean; .cpp和.h中不支持boolean只能用BOOL;
xxx.odl 中不支持int 支持long .参数写成int时 ctrl+w就不管用了,报
“Parsing error: "int" is not a valid OLE parameter type。”
3.2、接口函数都写在 xxxCtl.cpp中
3.3、VC设置编译时活动的工程
3.3.1>menu---Project---Settings(具体的项目,无参考价值,请读者忽略!)
[img]http://dl.iteye.com/upload/attachment/531397/f213e793-f9fd-3602-aedf-8fd0b1fca2fb.png[/img]
3.3.2>menu---Build---Set Active Configuration
[img]http://dl.iteye.com/upload/attachment/531399/0b610055-673e-3963-8b3c-9580a704dd70.png[/img]
3.4、用regsvr32 注册不到系统里报“[color=red]找不到指定模块[/color]”错误。
分析:有可能控件有依赖的其它DLL文件没有在系统System32下。
解决办法:用工具depends查看一下ocx 控件的依赖关系,其中有黄色标记的dll 就是该控件所需要的。将其放到system32下就可以了。([color=red]这个方法百试不爽[/color],[color=blue][url=http://ileson.iteye.com/blog/1041106]同样可以解决浏览器有些可以加载有些加载不上去的问题[/url][/color])

今天发现:LoadLibrary("xxx.dll"); 返回NULL 也是这个问题。。。
3.5、解决ActiveX 工程无法用vc 调试的问题(更正:[url=http://blog.sina.com.cn/s/blog_538a8c730100u93l.html]是有办法的[/url];[url=http://hi.baidu.com/1ian9yu/item/79e25e4050843feca5c06694]各种调试[/url])
方法一:笨办法 AfxMessageBox();(在适当的时候用,这个太费劲了,特别是大项目时)
方法二:曲线救国 ;
·在一个工作空间中分别建ActiveX工程 和Dialog工程,用dialog 工程来管理ActiveX工程。具体办法 就是用dialog 工程来加载ActiveX工程下你自己写的程序文件,然后编译调试就OK
·在这期间遇到dialog中无法编译源程序,提示找不到头文件。解决方法如下: 1、Project -->Settings-->如下图:
[img]http://dl.iteye.com/upload/attachment/604292/13839d76-c239-3946-b11a-a6f4629d9cd3.png[/img]
3.6、很多时候,在本机编写ocx时,本机上的浏览器加载不到这个控件,今天终于发现如何解决了。
其实不是找不到,是因为浏览器通过clsid 已经找到本机有自己制作的控件了,所以它就默认不再加载控件到浏览器控件的目录了。如果这时候,你把vc工程清理一下,再通过浏览器访问你的页面时,就会加载你的控件。害我迷糊了好长时间,甚至要测试我还要换一台机器。希望新手可以解惑!!!!


3.7、页面刷新,重复加载ocx对象几次后,会将浏览器卡死。。。(还未找到解决办法,哪位有解决思路,QQ:278952725)
经过大量的实验,发现比较接近的可能是:
3.7.1、资源占用未及时释放。(如调用了第三方的dll,这个dll用调用了i/o 操作,何时释放不受控制,so 出现崩溃)如操作外设,i/o资源没有及时释放(我遇到的一个例子是:我写了两个控件(功能是一样的,调用同样的硬件资源)分别加载到两个页面中,当点A页面后,再点B页面就会造成浏览器崩溃,甚至关闭!)。程序中一定要注意释放i/o资源,及其它耗时的操作!
3.7.2、程序问题。多线程造成的死锁。

3.8、因为现在有好多机器装的是64位的操作系统(win7,win8),这时候老的32位动态库,放到system32 下就不能被调用了。。
解决办法:windows下有个 sysWOW 目录。。。把32位的dll 放到这里在。。。{我发现[url=http://ileson.iteye.com/blog/1982621]打成cab压缩包[/url]后,在浏览器端 自动解压时,也会自动解压到 sysWOW64中!所以还是打包方便}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值