在 C++Builder 2006 中使用 Indy10 控件!

首先,这是个 C++ Builder 2006 的 BUG!

C++Builder 的大部份控件均从 Delphi 的 .pas 而来。

从 .Pas 编译生成的 .hpp 会丢失部分 struct 信息,这点从编译 IdWinsock2.pas 生成 IdWinsock2.hpp 中得到了证实,而宝兰提供的 Update1 中更新的 IdWinsock2.hpp 中却提示不能使用在 C++Builder 环境下。

IdWinsock2.hpp 是一个非常关键的库文件,他的错误导致了大多 Indy10 的控件不能在 C++Builder 中使用。

为什么会如此呢,请看下面的 IdWinsock2.pas 片断( 904 - 916 行):

904:  {$NODEFINE PTransmitFileBuffers}
905:  PTransmitFileBuffers = ^TTransmitFileBuffers;
906:  {$NODEFINE _TRANSMIT_FILE_BUFFERS}
907:  _TRANSMIT_FILE_BUFFERS = record
908:      Head: Pointer;
909:      HeadLength: DWORD;
910:      Tail: Pointer;
911:      TailLength: DWORD;
912:  end;
913:  {$NODEFINE TTransmitFileBuffers}
914:  TTransmitFileBuffers = _TRANSMIT_FILE_BUFFERS;
915:  {$NODEFINE TRANSMIT_FILE_BUFFERS}
916:  TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS;

原因分析:

905行的定义应当在914行执行后才能被正确定义,诸如此类情况在该文件内却很多。

在 DELPHI 却是可以正确运行的, 而转换到 .HPP 文件时,结构体 _TRANSMIT_FILE_BUFFERS 会丢失。

原因既然找到了,那么对照 .pas 文件来分析 .hpp 文件,原来一些类的定义均正确(如果类有误,那就麻烦大了),只是丢失了部份结构而已。

只能手工改动了,依据 pas -> hpp 的规则,前后加上 push 与 pop, 如下:

#pragma pack(push,1)
typedef struct _TRANSMIT_FILE_BUFFERS
{
 void * Head;
 DWORD HeadLength;
 void * Tail;
 DWORD TailLength;
} TRANSMIT_FILE_BUFFERS;
#pragma pack(pop)

typedef TRANSMIT_FILE_BUFFERS TTransmitFileBuffers;
typedef TTransmitFileBuffers * PTransmitFileBuffers;

由于改动的地方太多,不再一一列出。修改好完整的 IdWinsock2.hpp 可从下面地址下载:

http://qc.borland.com/wc/AttachmentHandler.ashx?r=24079&fn=IdWinsock2.zip

OK! 将这个文件替换成原有的 IdWinsock2.hpp 文件,编译时可能会出现变量重复定义,只要注释掉这些行即可。

后结:

虽然 BDS 发行后,BUG 不断,但不要对此束手无策, 而是应当努力地去解决他,很多问题都是出现定义上。Indy10 控件发行后,相对来说,性能比 Indy9 提高了不小。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值