首先,这是个 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 TRANSMIT_FILE_BUFFERS TTransmitFileBuffers; |
由于改动的地方太多,不再一一列出。修改好完整的 IdWinsock2.hpp 可从下面地址下载:
http://qc.borland.com/wc/AttachmentHandler.ashx?r=24079&fn=IdWinsock2.zip
OK! 将这个文件替换成原有的 IdWinsock2.hpp 文件,编译时可能会出现变量重复定义,只要注释掉这些行即可。
后结:
虽然 BDS 发行后,BUG 不断,但不要对此束手无策, 而是应当努力地去解决他,很多问题都是出现定义上。Indy10 控件发行后,相对来说,性能比 Indy9 提高了不小。