Delphi使用VB编写的ActiveX控件全攻略

Delphi使用VB编写的ActiveX控件全攻略,第1张

Delphi使用VB编写的ActiveX控件全攻略,第2张

在最近几周的工作中,我一直被一个头疼的问题困扰着,就是VB6编写的ActiveX控件在Delphi环境下出现了很多奇怪的问题。几经周折,在搜索了几乎所有的论坛和资料后,终于在不同的Delphi版本中找到了问题的解决方案。

Delphi 5的一个令人费解的致命异常

先来看看Delphi 5下VB写的ActiveX控件奇怪的表现。

比如我们用VB写了一个控件UserTest(为了简单起见,我们只导出一个类,即用户控件),一个属性TestName和一个方法TestMethod。然后编译成ActiveX控件,注册后导入到Delphi5的开发环境中(以上步骤不清楚请参考各种参考资料,必须有标准答案)。到目前为止,一切似乎都很正常。

然后,我们习惯于在窗体上拖拽控件,调整大小,在属性窗口中给属性赋值,或者在代码中也是一样,这是非常正常和容易使用的。然而,问题来了。如果兴致勃勃地调用TestMethod,会得到一个古怪的异常“Ole Error 800a01a9”,然后程序就会退出。不幸的是,你将无法跟踪这个异常,这是在Delphi或VB中发现的。当然,如果你擅长汇编,你可以按照Delphi的调试窗口一步一步来...

当我第一次遇到这个问题的时候,我差点气炸了,因为无论是微软还是Borland都没有对错误做出任何解释,也没有资料可以找。我不得不去了几个我经常去的论坛。当然,最重要的是CSDN。我在VB版和Delphi版中到处搜索类似的问题。然后很不幸,只有类似的问题,没有答案。一个大客户使用了这个开发工具。在Windows上测试了几乎所有的开发工具和开发环境(包括桌面和Web)后,我忘记了Delphi。

剩下的两天,我几乎跑遍了全世界,给所有的朋友打电话,问德尔福的专家是否知道这个情况。最后,我从谷歌上搜索了一个链接。可惜我现在忘记了那个环节的具体位置,但是我得到了一个近乎神奇的方法(发现者就是这么叫的):

一种手动修改代理类型库XXX_TLB的方法。Delphi导入VB ActiveX控件后生成的PAS (XXX这里指控件的类名)文件可以解决这个问题。示例:

有一个用VB写的控件UserControl1。在Delphi中导入后,产生两个文件,其中一个是UserControl1_TLB。PAS,是我们要修改的文件。

在文件中找到类似的东西

FintF:_ user control 1;

函数GetControlInterface:_ user control 1;

property control interface:_ user control 1 read get control interface;

GetControlInterface

程序t用户控制1。CreateControl

过程文档创建;

开始

finf:= I unknown(ole object)as _ user control 1;

结束;

开始

如果Finf=nil,则DoCreate

结束;

功能TUserControl1。get control 1 interface:_ user control 1;

开始

CreateControl

结果:= Finfl

结束;

请注意:此处标记为红色的all _UserControl1应替换为_ UserControl1Disp。如果编译不成功,请将编译警告中报告的all _UserControl1替换为_UserControl1Disp并编译,这样在调用控件的方法时就不会出现上述致命错误。

感谢这个伟大的发现,我只能这样形容。否则,我可能到现在还困在这个圈子里,也可能用另一个工具重新开发这个控件(我无法想象这要做多少工作,也可能有其他兼容性问题)。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Delphi使用VB编写的ActiveX控件全攻略

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情