前言
在最近几周

工作里

始终被

个头疼

问题所困扰

那就是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就是我们所要修改

文件

在文件中查找类似
F

F:_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栏上始终没有发现那个期待已久

小图标

这样

结果当然很滑稽

我连加载都做不到

更不要谈什么测试正常不正常了

同样


我搜索各类论坛和网站WebSite

CSDN里我也发现了更多

类似问题

提出者

但答案还是零

无奈的下

我只好对每个Delphi6、7中

选项进行调整……
历时3小时15分54秒后

我找到了这个该死

问题(请原谅我这么称呼它

我实在是忍无可忍)

原因

或者说是解决办法

说起来其实很简单

现在请跟着我做:点击Tools菜单->EnvironmentOptions->TypeLibrary页,我们应该发现

项:IgnorespecialCoClassFlagsWhenImporting

选中它

然后再选中CanCreate那

项

那么现在

我们再尝试去导入那个可怜

ActiveXControl控件吧(这里要注意

如果你已经导入过

次

那么请把产生

那两个文件.dcr和.pas文件删除

否则将不会刷新)

这次如果还是不能在ActiveX栏中发现那个Control控件

话

那么只有致电Microsoft或是Borland

问问看什么时候它们能结成亲家

呵呵!
(另

在Delphi6和7中倒是没有发现Delphi5中出现

上述

)
我

测试环境是:
Win2K
Delphi5Update1
Delphi6Update2
Delphi7