sgcIndy を 5 分で

sgcIndy は、名前を変えて分岐させたものではなく、メンテナンスされている Indy のビルドです。ユニット名、クラス名、コンポーネントパレットのページは、すでにお使いのものと同じです。そのため、クイックスタートは「このコードを書く」ではなく、「インストールして、再ビルドし、新しいプロパティを 1 つ設定する」です。

Indy と同じユニット名とクラス名
OpenSSL 1.0、1.1、3.0 と TLS 1.3
Delphi、C++Builder、FreePascal、Lazarus

他のすべてを決定づける事実

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 を読み込んでいることを確認することです。

1. インストーラーを実行する

ダウンロードしたセットアップを実行し、必要な RAD Studio のバージョンとプラットフォームにチェックを入れます。ライブラリがコピーされ、Community と Basic のパッケージではソースファイルが除かれます。

2. パッケージを入れ替えさせる

インストーラーは IDE 組み込みの Indy デザイン時パッケージの登録を解除し、その代わりに自身のパッケージを登録します。これにより、同じユニット名が sgcIndy に解決されます。

3. 検索パスを修正させる

プラットフォームごとに、sgcIndy のフォルダーを IDE の検索パスの先頭に置き、以前のインストールの古いエントリを削除します。

4. スプラッシュ画面で確認する

IDE を再起動します。スプラッシュ画面に sgcIndy と表示され、Indy の「バージョン情報」ボックスにも同様に表示されます。入れ替えが反映されたことの確認になります。

5. プロジェクトを再ビルドする

既存の Indy プロジェクトを開いて再ビルドします。uses 句には手を加えないでください。標準の Indy に対してコンパイルできたなら、これに対してもコンパイルできます。

再ビルドして、TLS 1.3 を利用する

1 つ目のタブは、既存のプロジェクトがすでにどのような状態かを示します。2 つ目は、追加する価値のある新しい 1 行です。3 つ目は、標準の Indy ではなく sgcIndy を使用していることの証明です。

FHttpClient.pas
// 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 の接頭辞が付いていないためです。インストールして、再ビルドすれば完了です。

FHttpClient.pas
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 には、この型もプロパティも存在しないため、このスニペットは、どのライブラリに対してビルドしているかのコンパイル時の証明になります。

fTcpClient.pas
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 個のデモが同梱されています。

sgcIndy で動作していることを確認する

ユニット名が同一のため、自分のソースからは区別できません。確実な 3 つの確認方法を紹介します。

スプラッシュ画面

インストール後に IDE を再起動します。スプラッシュ画面に sgcIndy と表示されます。パッケージの入れ替えが反映されたことの確認で、最も手早い方法です。

「バージョン情報」ボックス

Indy の「バージョン情報」ダイアログには、標準のテキストではなく eSeGeCe と表示され、無料パッケージでは Community Edition と表示されます。

標準の Indy ではコンパイルできない行

SSLOptions.APIVersion := sslvAPI_3_0;。標準の Indy には TIdSSLAPIVersion 型が存在しないため、その行がビルドできれば sgcIndy を使用しています。

自分のプロジェクト

uses 句に手を加えずに再ビルドしてください。ユニット名とクラス名が同一なので、以前とまったく同じようにコンパイルできるはずです。

初回によくあるつまずき

移行で起きる問題のほとんどは、6 つのいずれかです。

sgcId のユニットを探してしまう

ありません。ライブラリ内で sgc の接頭辞が付いたユニットもクラスも 0 個です。uses 句を sgcIdTCPClient に書き換えると、そのようなユニットは存在しないため、プロジェクトはコンパイルできません。

IDE がまだ標準の Indy を読み込む

パッケージの入れ替えはインストーラーが行うため、通常は、インストールが完了していないか、手動で追加した検索パスのエントリが優先されていることを意味します。入れ替えが反映されていれば sgcIndy と表示されるスプラッシュ画面を確認してください。

TLS 1.3 がネゴシエートされない

両方のプロパティを設定してください。SSLOptions.APIVersion は使用する OpenSSL API の世代を選択し、SSLOptions.Method はプロトコルのバージョンを選択します。TLS 1.3 には 3.0 API が必要なので、2 行を一緒に変更する必要があります。

OpenSSL の DLL がない

各デモフォルダーには、必要な一式が実行ファイルの隣に同梱されています。3.0 API では libcrypto-3.dll と libssl-3.dll です。古い API では名前が異なり、誤ったペアをコピーすることは、ハンドシェイクが始まる前に失敗する一般的な原因です。

Lazarus でユニットが失敗する

Lazarus のビルドでは、コンパイラーの define で Delphi モードが意図的に無効にされており、そこでは失敗するというコメントがあります。Delphi モードの動作に依存するコードは調整が必要です。

パッケージにソースファイルがない

Community と Basic のインストーラーは、コンパイル済みバイナリを同梱し、.pas と .inc ファイルを除外しています。ライブラリの中にステップインする必要がある場合は、ソースを含むパッケージが必要です。

sgcIndy が Indy に追加するもの

再ビルドが終わった後に知っておく価値のある 4 つのことです。

最新の OpenSSL と TLS 1.3

標準の Indy 10.6.2 は、OpenSSL 1.1 と 3.0 の API 変更より前のものです。SSLOptions.APIVersion が世代を選択し、3.0 API で sslvTLSv1_3 が利用可能になります。

sgcIndy の機能

SSH と SFTP

TIdSSHClient と TIdSFTPClient は、標準の Indy にはまったくありません。どちらもデモが同梱されています。

SSH クライアントとSFTP クライアント

高性能サーバー

IOCP と epoll の IO ハンドラーは、Windows と Linux で接続ごとにスレッドを割り当てるモデルを置き換え、実際の負荷がかかったときのサーバーの在り方を変えます。

比較

メールの最新の認証

XOAUTH2 に対応しているため、SMTP や IMAP のクライアントは、基本認証を廃止したプロバイダーに対しても認証できます。

sgcIndy の XOAUTH2

リファレンス、デモ、ドキュメント

エコークライアントから SSH、SFTP まで、18 個のデモプロジェクトがダウンロードに含まれています。

sgcIndy の機能 このビルドが Indy 10.6.3 に対して修正し、追加するものです。
比較 sgcIndy と標準の Indy を、機能ごとに比較します。
ダウンロード Community パッケージは無料でご利用いただけます。
注文 完全なソースを含むパッケージです。
製品概要 sgcIndy とは何か、そして誰のためのものかを説明します。
すべての製品 eSeGeCe のすべてのライブラリの価格を 1 つの表にまとめています。

関連資料:Indy での OpenSSL 3.0、IOCP サーバー、SSH クライアント、最新のリリースノート。各製品にはそれぞれクイックスタートがあり、はじめにのページに一覧があります。

sgcIndy クイックスタートに関するよくある質問

いいえ。これが sgcIndy について最も重要な点です。すべてのユニットは元の Indy の名前、IdTCPClient、IdHTTP、IdSSLOpenSSL などを保持し、すべてのクラスも元の名前、TIdTCPClient、TIdHTTP、TIdSSLIOHandlerSocketOpenSSL を保持します。ライブラリ内に、sgc の接頭辞が付いたユニットもクラスもありません。インストールして再ビルドすれば、プロジェクトは sgcIndy で動作します。
インストーラーが入れ替えます。IDE から組み込みの Indy デザイン時パッケージの登録を解除し、その代わりに sgcIndy のパッケージを登録して、sgcIndy のフォルダーを検索パスの先頭に置きます。ユニット名が同一なので、変える必要があるのはコードではなく、これです。
3 つの確認方法があります。IDE の起動時のスプラッシュ画面に sgcIndy と表示されます。Indy の「バージョン情報」ボックスにも同様に表示されます。そして、コンパイル時の証明があります。SSLOptions.APIVersion はこのビルドにしか存在しないため、それに sslvAPI_3_0 を代入する行は、ここではコンパイルでき、標準の Indy では失敗します。
2 つのプロパティを一緒に設定します。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 を実行ファイルの隣に配置してください。
ライブラリは自身を Indy 10.6.3.12 として報告します。sgc による変更は、元のファイルの内部で、コメントで示され、条件付き define で保護されて行われており、ユニット名を同じままにできたのはそのためです。
どれもありません。機能がエディションで制限されることはないためです。エディションのフラグはビルド時に挿入され、ライブラリ全体で利用するのは、「バージョン情報」ボックスのキャプションと IDE のスプラッシュ画面のテキストという、どちらも見た目だけの 2 か所です。階層が実際に変えるのはパッケージの内容です。Community と Basic のインストーラーは .pas と .inc ファイルを除いたコンパイル済みバイナリを同梱し、ソース付きのパッケージにはそれらが含まれます。
はい。Lazarus パッケージが、FreePascal のパッケージスタブとビルドファイルとともに同梱され、コンパイラーの対応範囲は FPC 2.2.2 から 3.3.1 です。始める前に知っておくべき注意点が 1 つあります。コンパイラーの define で、Lazarus では Delphi モードが意図的に無効にされており、そこでは失敗するというコメントがあるため、Delphi モードの動作に依存するユニットは調整が必要です。
Windows、Linux、macOS、FreeBSD、iOS、Android には、コンパイラーの define にそれぞれ独自の条件付きブロックがあります。Unix のターゲットは OpenSSL と同梱の zlib ユニットを使用します。iOS には実際の制約があり、OpenSSL を実行時に読み込むのではなく、静的にリンクする必要があります。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

標準の Indy から移行する準備はできましたか?

Community パッケージは無料です。インストールして、再ビルドし、スプラッシュ画面を確認してください。