专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Delphi教程 » vbactivex控件:Delphi使用VB编写的ActiveX控件全攻略 »正文

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

来源: 发布时间:星期四, 2009年2月12日 浏览:255次 评论:0



前言
在最近几周工作里始终被个头疼问题所困扰那就是VB6编写ActiveXControl控件在Delphi环境下存在着诸多稀奇古怪问题几经周折终于在搜索了几乎全部论坛、资料后找到了针对区别Delphi版本发生问题解决办法



Delphi5莫名其妙致命异常的
首先我们来看看VB写ActiveXControl控件在Delphi5下面奇怪表现

例如:我们用VB编写了个Control控件UserTest(为简单起见我们只导出个类即用户Control控件)个属性TestName,个思路方法TestMethod然后将其编译成个ActiveXControl控件注册并导入Delphi5开发环境(以上步骤如有未清楚的处请查阅各类参考资料肯定有标准答案)到目前为止看来切正常

然后我们习惯把Control控件拖放到窗体上调整大小在属性窗口中为属性赋值或者在代码中也是非常正常好用但是下面问题来了如果您兴致勃勃了那个TestMethod那么您将得到个古怪异常“OleError800a01a9”然后退出而且非常不幸您将无法跟踪到这个异常在Delphi中或是VB中都是当然如果您对汇编很在行您可以跟着Delphi调试窗口步往下……

当我第次碰到这个问题时候我几乎是愤怒无论是MicroSoft或是Borland对该都没有任何解释也没有任何可以查找资料我只好跑到常去几个论坛当然最主要还是CSDN在VB版和Delphi版中 4处搜索类似问题然后非常遗憾只有类似问题而没有答案个大客户就用这个开发工具我在测试了几乎所有Windows上开发工具和开发环境(包括桌面和WEB)后惟独将Delphi忘记了

剩下两天里我几乎是满世界乱跑给所有朋友打电话询问Delphi方面高手是否知道这个情况最后我从Google上搜到了个链接可惜是现在我忘记了那个链接具体位置但是我得到了个近乎Magic思路方法(发现者是这么称呼它):



个手工修改Delphi导入VBActiveXControl控件后产生代理类型库XXX_TLB.PAS(这里XXX指是Control控件类名)文件思路方法可以解决这问题举例介绍说明:



个VB写Control控件UserControl1在Delphi中导入后产生两个文件其中个UserControl1_TLB.PAS就是我们所要修改文件

在文件中查找类似



FF:_UserControl1;

FunctionGetControlInterface:_UserControl1;







propertyControlInterface:_UserControl1readGetControlInterface;



GetControlInterface;



以及



procedureTUserControl1.CreateControl;

procedureDoCreate;

begin

Finf:=IUnknown(OleObject)as_UserControl1;

End;

Begin

IfFinf=nilthenDoCreate;

End;



FunctionTUserControl1.GetControl1Interface:_UserControl1;



Begin

CreateControl;

Result:=Finfl;

End;



请注意:这里红色标出_UserControl1要全部换成_UserControl1Disp如果编译不成功请将编译警告中报出_UserControl1全部换成_UserControl1Disp编译即可这样在Control控件思路方法时便不会出现上述致命



感谢这个伟大发现我只能这么形容它否则可能到现在我还要在这个圈子里套不出来或者就是使用另外工具重新开发这个Control控件(我难以想象这个工作量会有多大又或者它可能还会存在其他兼容性问题)





Delphi5莫名其妙致命异常的 2
但是Delphi并没有在我绕开这个限制的后而放过我很快客户那边发现另个麻烦问题在开发环境下每次运行时关闭载有Control控件窗体都会跳出个异常但是在编译后应用中则不会虽然不会影响最终用户使用但是这对开发人员来说是个不小困扰然后我用了上述例子去试发现并不会发生这个问题(我当时就疯了这很可能是代码中些不兼容使用方法所致天时间里查找上万行代码是不是很正规是件极其恐怖事情)我气的下屏蔽了我Control控件中所有代码只留下用户界面本身然后奇怪事情发生了我什么代码都没写但是加载我Control控件还是会发生这个这使我又喜又惊是这个问题和我代码无关这样查找起来会方便多;惊是只是拖放几个VB中标准Control控件居然也会造成这种恐怖Delphi5和VB6的间矛盾还真不是接下来2个小时里我不断地删除界面上Control控件来测试到底是谁造成了这个致命异常



2个小时后我舒了口气问题找到了其根本问题是:



如果你在VB用户Control控件中使用类似Frame和PictureBox这样容器Control控件(其内部可以包含其他Control控件)时那么您将不可以在这些Control控件中添加Label、Line、Image这样windowLessControl控件(也就是无窗口Control控件它们在运行时是VB实时画出来)否则您就会得到上面这样报告





Delphi6、7隐蔽ActiveXControl控件


正是有了Delphi5下面恐怖经历我发现还是很有必要在Delphi6和7下面测试是不是也存在同样问题(的前版本用户极少已无必要Delphi8还没正式出也暂不在考虑的列)结果是:……无论我加载多少次我在ActiveX栏上始终没有发现那个期待已久小图标这样结果当然很滑稽我连加载都做不到更不要谈什么测试正常不正常了

同样我搜索各类论坛和网站WebSiteCSDN里我也发现了更多类似问题提出者但答案还是零无奈的下我只好对每个Delphi6、7中选项进行调整……

历时3小时15分54秒后我找到了这个该死问题(请原谅我这么称呼它我实在是忍无可忍)原因或者说是解决办法说起来其实很简单

现在请跟着我做:点击Tools菜单->EnvironmentOptions->TypeLibrary页,我们应该发现项:IgnorespecialCoClassFlagsWhenImporting选中它然后再选中CanCreate那那么现在我们再尝试去导入那个可怜ActiveXControl控件吧(这里要注意如果你已经导入过那么请把产生那两个文件.dcr和.pas文件删除否则将不会刷新)这次如果还是不能在ActiveX栏中发现那个Control控件那么只有致电Microsoft或是Borland问问看什么时候它们能结成亲家呵呵!



(另在Delphi6和7中倒是没有发现Delphi5中出现上述)



测试环境是:

Win2K

Delphi5Update1

Delphi6Update2

Delphi7

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: