在PB中使用OCX控件遇到的问题 |
gao在2009/8/12发表,被浏览4715次
|
最近在为高深商的JD-2000系列来电管理器编写PB的使用实例,期间遇到了不少有关ActiveX控件在PB中的各种现象,先把我的经历写下来,希望对大家有所启发。 关于OCX控件:这是一个专为高深商公司专为JD-2000系列来电管理器编写的,用于电话的来电显示、电话拨号、电话录音、语音播放以及电话按键的检测,是实现电脑与电话连接的重要中间控件。在它的内部已经处理了与硬件的连接,它可以自动查找连接到电脑的所有来电设备,并保存它们的设置;而不必关心它们连接在那一个端口、通讯的协议怎样、有几个设备等等。 要实现录音功能只要将控件设为相应的录音状态,它会按你的要求自动生成录音文件(wav),放到你指定的位置。生成的文件可以使用目前大多数的媒体播放器播放,当然包括Windows自带的媒体播放器。需要播音时只要把录音文件的文件名交给控件,它就会在你指定的线路上播出录音文件。不管哪一条线路有来电进来,控件都会以事件发生的形式通知你。当然电话振铃、摘机、挂机、按键等也会以事件发生的形式通知你。 本文的重点不在控件的功能,而是在它在PB中使用时的各种有趣的现象。我们知道,很早版本的powerbuilder 就开始支持ActiveX控件了通常的使用方法是 1、先注册OCX控件,使用的办法是在命令窗口 输入 regsvr32.exe path\JDcomport.ocx 其中path是JDComport.ocx所在的路径,在这个路径下还应该包含一个控件要用到的动态链接库 qtintf.dll 2、在你的窗体里加入JDComponent控件: 方法是:在系统菜单选择Insert 选择 Control子菜单 选择 OLE... 进入 Insert Object 窗口 在Insert Object 窗口选择 Insert Control页 在Insert Control页 找到 JDComponent Control 并把它放到窗体上即可。 在大多数情况下,你应该是很顺利的,如果我也是这么顺利的话,也就不会有本文了,很不幸的是我到不了这一步,就在第2步的时候PB就发生了灾难性错误,整个退出了。具体的情况是当我在Insert Object 窗口选择 Insert Control页是 系统提示 Out of Memory 选择 取消 系统退出。一开始我也怀疑是高深商的JD-2000系列来电管理器的OCX控件的问题,将这个问题反映给他们的工程师,他们的工程师也很快对他们的控件进行了检测,也找不出什么问题来。这个控件在其它编程工具里用的很好,并没有这种情况的发生。于是用google进行了搜索真还找到不少关于这个问题的文章和帖子。总结下来不外是: 1 这是PB的一个BUG 2 这是安装了某些与pb不兼容的软件 3 PB的兼容性不好 解决办法: 1 用比较高版本的PB 或者使用补丁 2 卸载某些软件 3 使用注册表清理工具清理注册表和实效软件 4 重装系统 以上办法部分或全部多是行得通的。为了得到出现问题的真正原因,我进行了一次实验,这个实验室是这样的: 1 安装一个纯的操作系统 这里用的是XP sp2,也就是出了操作系统和必要的驱动程序外什么也不安装。 2 安装pb6.5 3 注册控件 4 使用控件 用之前介绍的方法添加JDComponent控件,不会再有系统崩溃的现象出现,之后反复用PB7 PB8 PB9 PB10进行一样的测试,也不会出问题。由此可见,产生系统崩溃的原因是由于某些OCX控件引起的。在其后的实验里进一步证明了这一点。在添加了控件的工程,回到有问题的操作系统时,正常使用这个控件是没有任何问题的。我估计问题的产生是这样的,添加一个OLE控件到窗体时要打开 Insert Object窗口上的 Insert Control页,当这一页被激活时,系统试图去枚举所有安装到系统的ActiveX控件,结果在尝试列出某个控件的某种属性时除了问题,导致了系统的崩溃。因此只你的应用程序没有用到有问题的控件就不会导致系统的崩溃,而且也仅仅是发生在控件列表之时。在PB9.0后的版本里 System Tree 窗口有了Components的一页,我们通过这一页的目录树仍然可以使用我们添加ActiveX控件到我们的程序里。 这个结果是否可以说PB就一点责任都没有吗?至少在我的电脑里PB10以上的版本就根本不会发生这样的问题,也许这就是PB的一个改进吧。 最后给个BP安装ActiveX控件的小结: 1、如果有得选择,最好用PB10以上的版本,9.0版本的也勉强可用; 2、一定要用在9.0以下版本的,只好在一台干净的机器上添加上控件后再到你的机器里进编辑调试。
|
|
|
|