在 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 提高了不小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章