|
Indy10やIndy9は、ネットワーク系のコンポーネントを提供してくれるパッケージだが、これもかなり不都合があるようで、私は使うようになるまでに一苦労した。ここでは私が苦労した部分の説明だけ書きたいと思う。
|
|
ここでは、以下のような不具合などについて書く。
- インストール方法
- TIdHTTPの「日付に変換できない値が渡されました」
- TIdHTTPで302エラー
これらについては本当に手を焼いた。
|
|
まずはインストール。これも本当に大変だった。ここではDelphi 6 Personalを使用したとする。「〜〜60」というファイルをインストールすればよいのだが、これらには順番があるらしく、一度失敗するとすべてアンインストールしてから再度挑戦となる。順番は以下の通りだが、似た名前のファイルがたくさんあるので注意して欲しい。
・...\Indy\System\IndySystem60.dpk
・...\Indy\Core\IndyCore60.dpk
・...\Indy\Protocols\IndyProtocols60.dpk
|
これらをインストールするときは、「オプション」で、パッケージの種類の「設計/実行時とも使用可能」にチェックを入れる。インストールしたら「×」を押して保存する。
つぎに、以下のファイルを以下の順番でコンパイル&インストールする。今回はオプションをいじる必要はない。だが、コンパイルの必要がある。
・...\Indy\Core\dclIndyCore60.dpk
・...\Indy\Protocols\dclIndyProtocols60.dpk
|
この辺には似たファイルがあるので要注意だ。ここで間違うと再インストールとなる。
これでインストールは終わりだ。何度も言うようだが、ファイル名には細心の注意を払っていただきたい。
|
TIdHTTPの「日付に変換できない値が渡されました」
|
|
これはWebページのヘッダの問題だ。Expires:-1が指定されていると出るようだが、Indyのバグではないため原因の発見は難しかった。Indy9では、Expiresに空の値が入っていてもこの例外が出るが、Indy10では空の値には対応したようだ。だが-1や0には、未対応なので、これらに対応する必要がある。
まず確認する必要があるのは、「*.dcu」があるかどうかだ、Indy10フォルダに「System」や「Core」などのフォルダがあるが、その中の「*.pas」がすべてコンパイルされているか、を確認する。もしされていない場合は、上のインストールで、最初の3つのコンパイルをしていないファイルをコンパイルする。これで完了だ。
次に、「IdGlobalProtocols.pas」をプロジェクトに追加する。そして、「GMTToLocalDateTime関数」の中を修正する。修正箇所は以下の通りだ。
if s = '' then
begin
result := 0;
end
else
begin
Result := RawStrInternetToDateTime(S);
|
こんな感じの部分があるはずだ。もう気づいていると思うが、1行目に-1のときと0のときの処理を追加するだけだ。
if(s = '')or(s = '-1')or(s = '0')then
begin
result := 0;
end
else
begin
Result := RawStrInternetToDateTime(S);
|
こうだ。あとはコンパイルしたら再インストールするだけでよい。どうせなら以下のバグを直してからインストールしなおしたほうがいいだろう。
|
|
これはたいしたことはない。ただRFCで302が定義されているのに、ここで予期できないのはおかしい。これで悩む人もいると思うが、単に「HandleRedirects」をTrueにすればいいだけ。また、「IdHTTP.pas」の「Id_TIdHTTP_HandleRedirects」を最初からTrueにしておくのもいいだろう。
|