首先,這是個 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 提高了不小。