sgcIndy を 5 分で
sgcIndy は、名前を変えて分岐させたものではなく、メンテナンスされている Indy のビルドです。ユニット名、クラス名、コンポーネントパレットのページは、すでにお使いのものと同じです。そのため、クイックスタートは「このコードを書く」ではなく、「インストールして、再ビルドし、新しいプロパティを 1 つ設定する」です。
sgcIndy は、名前を変えて分岐させたものではなく、メンテナンスされている Indy のビルドです。ユニット名、クラス名、コンポーネントパレットのページは、すでにお使いのものと同じです。そのため、クイックスタートは「このコードを書く」ではなく、「インストールして、再ビルドし、新しいプロパティを 1 つ設定する」です。
sgcId という接頭辞はありません。ユニットにも、クラスにもありません。既存のコードはそのままコンパイルできます。
Indy そのままの名前です。IdTCPClient、IdHTTP、IdSSLOpenSSL、そして約 400 のユニットがあります。ライブラリ内のどのユニットも、sgc の接頭辞付きの名前ではありません。
こちらも Indy そのままの名前です。TIdTCPClient、TIdHTTP、TIdSSLIOHandlerSocketOpenSSL、TIdSSHClient、TIdSFTPClient。
同じ 5 つです。Indy Clients、Indy Servers、Indy Intercepts、Indy I/O Handlers、Indy Misc。それらに約 166 のコンポーネントが、いつも見ている場所に並んでいます。
インストーラーは、IDE が読み込むパッケージを入れ替え、検索パスを書き換えます。プロジェクトは変わりません。目に見える違いは、新しいプロパティ SSLOptions.APIVersion と、その内部の修正です。
sgcIndy には機能による階層がありません。ライセンスの階層が変えるのは、パッケージに含まれる内容であり、コードでできることではありません。
| 項目 | 内容 |
|---|---|
| IDE | Delphi 7 から RAD Studio 13、および C++Builder 2007 から 13。それぞれ用のパッケージグループが同梱されています。 |
| uses 句 | 変更なしです。ユニット名は標準の Indy と同一なので、プロジェクトにすでに書かれているものはそのまま動作します。 |
| Indy のベースバージョン | ライブラリは自身を Indy 10.6.3.12 として報告します。sgc による変更は、ユニットの名前を変えるのではなく、元のユニット内のコメントと条件付き define で示されています。 |
| エディション | 機能による階層はありません。エディションのフラグはビルド時に挿入され、利用するのは「バージョン情報」ボックスと IDE のスプラッシュ画面のちょうど 2 か所です。ライブラリ内でこれによって制限されるものはありません。階層が実際に変えるのはパッケージの内容です。Community と Basic のビルドは .pas と .inc ファイルを除いたコンパイル済みバイナリを同梱し、ソース付きのビルドにはそれらが含まれます。 |
| FreePascal と Lazarus | サポートされています。Lazarus パッケージ、FreePascal のパッケージスタブとビルドファイルが同梱され、コンパイラーの対応範囲は FPC 2.2.2 から 3.3.1 です。1 つ注意点があります。Lazarus では Delphi モードが意図的に無効にされているため、それを前提としているユニットは調整が必要です。 |
| プラットフォーム | Windows、Linux、macOS、FreeBSD、iOS、Android には、それぞれ独自の条件付きブロックがあります。iOS では、OpenSSL を静的にリンクする必要があります。 |
始める前に知っておくべき最も役立つ点です。ユニット名が RAD Studio に同梱されている Indy と衝突するため、入れ替えはインストーラーが管理します。組み込みの Indy デザイン時パッケージの登録を解除し、独自のパッケージを登録し、IDE の検索パスを書き換えます。
作業はインストーラーが行います。重要なのは、その後 IDE が実際に sgcIndy を読み込んでいることを確認することです。
ダウンロードしたセットアップを実行し、必要な RAD Studio のバージョンとプラットフォームにチェックを入れます。ライブラリがコピーされ、Community と Basic のパッケージではソースファイルが除かれます。
インストーラーは IDE 組み込みの Indy デザイン時パッケージの登録を解除し、その代わりに自身のパッケージを登録します。これにより、同じユニット名が sgcIndy に解決されます。
プラットフォームごとに、sgcIndy のフォルダーを IDE の検索パスの先頭に置き、以前のインストールの古いエントリを削除します。
IDE を再起動します。スプラッシュ画面に sgcIndy と表示され、Indy の「バージョン情報」ボックスにも同様に表示されます。入れ替えが反映されたことの確認になります。
既存の Indy プロジェクトを開いて再ビルドします。uses 句には手を加えないでください。標準の Indy に対してコンパイルできたなら、これに対してもコンパイルできます。
1 つ目のタブは、既存のプロジェクトがすでにどのような状態かを示します。2 つ目は、追加する価値のある新しい 1 行です。3 つ目は、標準の Indy ではなく sgcIndy を使用していることの証明です。
// This is a shipped sgcIndy demo's uses clause.
// Read it twice: there is not one sgc prefix in it.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
IdSSLOpenSSL, IdSSLOpenSSLHeaders, StdCtrls;
既存のプロジェクトもすでにこのような状態であり、それが要点です。sgcIdTCPClient も TsgcIdSSLIOHandlerSocketOpenSSL もありません。ライブラリ内のどのユニットにもクラスにも、sgc の接頭辞が付いていないためです。インストールして、再ビルドすれば完了です。
procedure TFRMHttpClient.btnGoToClick(Sender: TObject);
var
oStream: TStringStream;
begin
// Two separate settings. APIVersion picks which generation of the
// OpenSSL API to call, Method picks the TLS version. TLS 1.3 needs
// the 3.0 API, so both lines change together.
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;
oStream := TStringStream.Create('');
try
IdHTTP1.Get(txtURL.Text, oStream);
finally
FreeAndNil(oStream);
end;
end;
TIdSSLAPIVersion のメンバーは sslvAPIDefault、sslvAPI_1_0、sslvAPI_1_1、sslvAPI_3_0 です。標準の Indy には、この型もプロパティも存在しないため、このスニペットは、どのライブラリに対してビルドしているかのコンパイル時の証明になります。
procedure TfrmTCPClient.btnConnectClick(Sender: TObject);
begin
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;
IdTCPClient1.Host := txtHost.Text;
IdTCPClient1.Port := StrToInt(txtPort.Text);
IdSSLIOHandlerSocketOpenSSL1.PassThrough := False;
IdTCPClient1.Connect;
end;
procedure TfrmTCPClient.btnDisconnectClick(Sender: TObject);
begin
IdTCPClient1.Disconnect;
end;
同じコンポーネント、同じプロパティ、同じパレットページです。標準の Indy とまったく同じように、PassThrough := False が通常のソケットを TLS ソケットに変えます。読み取りは IdTCPClient1.IOHandler.ReadLn、書き込みは IOHandler.Write で、変わりません。
最初の 2 つのタブは、同梱のデモ Demos\HttpClient\FHttpClient.pas から、コンボボックスをリテラルに置き換えたものです。SSH と SFTP のクライアント、FTP クライアント、メールクライアント、TCP サーバー、UDP のペアを含む、合計 18 個のデモが同梱されています。
ユニット名が同一のため、自分のソースからは区別できません。確実な 3 つの確認方法を紹介します。
インストール後に IDE を再起動します。スプラッシュ画面に sgcIndy と表示されます。パッケージの入れ替えが反映されたことの確認で、最も手早い方法です。
Indy の「バージョン情報」ダイアログには、標準のテキストではなく eSeGeCe と表示され、無料パッケージでは Community Edition と表示されます。
SSLOptions.APIVersion := sslvAPI_3_0;。標準の Indy には TIdSSLAPIVersion 型が存在しないため、その行がビルドできれば sgcIndy を使用しています。
uses 句に手を加えずに再ビルドしてください。ユニット名とクラス名が同一なので、以前とまったく同じようにコンパイルできるはずです。
移行で起きる問題のほとんどは、6 つのいずれかです。
ありません。ライブラリ内で sgc の接頭辞が付いたユニットもクラスも 0 個です。uses 句を sgcIdTCPClient に書き換えると、そのようなユニットは存在しないため、プロジェクトはコンパイルできません。
パッケージの入れ替えはインストーラーが行うため、通常は、インストールが完了していないか、手動で追加した検索パスのエントリが優先されていることを意味します。入れ替えが反映されていれば sgcIndy と表示されるスプラッシュ画面を確認してください。
両方のプロパティを設定してください。SSLOptions.APIVersion は使用する OpenSSL API の世代を選択し、SSLOptions.Method はプロトコルのバージョンを選択します。TLS 1.3 には 3.0 API が必要なので、2 行を一緒に変更する必要があります。
各デモフォルダーには、必要な一式が実行ファイルの隣に同梱されています。3.0 API では libcrypto-3.dll と libssl-3.dll です。古い API では名前が異なり、誤ったペアをコピーすることは、ハンドシェイクが始まる前に失敗する一般的な原因です。
Lazarus のビルドでは、コンパイラーの define で Delphi モードが意図的に無効にされており、そこでは失敗するというコメントがあります。Delphi モードの動作に依存するコードは調整が必要です。
Community と Basic のインストーラーは、コンパイル済みバイナリを同梱し、.pas と .inc ファイルを除外しています。ライブラリの中にステップインする必要がある場合は、ソースを含むパッケージが必要です。
再ビルドが終わった後に知っておく価値のある 4 つのことです。
標準の Indy 10.6.2 は、OpenSSL 1.1 と 3.0 の API 変更より前のものです。SSLOptions.APIVersion が世代を選択し、3.0 API で sslvTLSv1_3 が利用可能になります。
TIdSSHClient と TIdSFTPClient は、標準の Indy にはまったくありません。どちらもデモが同梱されています。
IOCP と epoll の IO ハンドラーは、Windows と Linux で接続ごとにスレッドを割り当てるモデルを置き換え、実際の負荷がかかったときのサーバーの在り方を変えます。
エコークライアントから SSH、SFTP まで、18 個のデモプロジェクトがダウンロードに含まれています。
| sgcIndy の機能 このビルドが Indy 10.6.3 に対して修正し、追加するものです。 | 開く | |
| 比較 sgcIndy と標準の Indy を、機能ごとに比較します。 | 開く | |
| ダウンロード Community パッケージは無料でご利用いただけます。 | 開く | |
| 注文 完全なソースを含むパッケージです。 | 開く | |
| 製品概要 sgcIndy とは何か、そして誰のためのものかを説明します。 | 開く | |
| すべての製品 eSeGeCe のすべてのライブラリの価格を 1 つの表にまとめています。 | 開く |
関連資料:Indy での OpenSSL 3.0、IOCP サーバー、SSH クライアント、最新のリリースノート。各製品にはそれぞれクイックスタートがあり、はじめにのページに一覧があります。
IdTCPClient、IdHTTP、IdSSLOpenSSL などを保持し、すべてのクラスも元の名前、TIdTCPClient、TIdHTTP、TIdSSLIOHandlerSocketOpenSSL を保持します。ライブラリ内に、sgc の接頭辞が付いたユニットもクラスもありません。インストールして再ビルドすれば、プロジェクトは sgcIndy で動作します。
SSLOptions.APIVersion はこのビルドにしか存在しないため、それに sslvAPI_3_0 を代入する行は、ここではコンパイルでき、標準の Indy では失敗します。
SSLOptions.APIVersion := sslvAPI_3_0 は OpenSSL 3.0 の API 世代を選択し、SSLOptions.Method := sslvTLSv1_3 はプロトコルを選択します。TIdSSLAPIVersion 型のメンバーは sslvAPIDefault、sslvAPI_1_0、sslvAPI_1_1、sslvAPI_3_0 で、TIdSSLVersion には sslvTLSv1_3 が追加されました。その後、デモと同様に libcrypto-3.dll と libssl-3.dll を実行ファイルの隣に配置してください。
.pas と .inc ファイルを除いたコンパイル済みバイナリを同梱し、ソース付きのパッケージにはそれらが含まれます。