# Tera Term 5 対応
date: 2021/11/23
自作プラグインを Tera Term 5 対応にするための検討メモをここに記す。
## 概要
Tera Term v.4.106 リリース(r9298, 2021/6/5)後、本格的に Tera Term 5 の実装が始まった。
Tera Term 5 のプラグインに対する主要な機能変更は以下となる。
* メジャーバージョンアップ
* 内部コードの Unicode 対応
* 設定ファイルの保存先の変更
* パス文字列の MAX_PATH(=260) 文字数の撤廃
* Windows 95 のサポート終了
* 実行環境変数(TTset, ComVar)の構造変更
## 「メジャーバージョンアップ」について
セキュリティに問題や使用機能に大きなバグでもない限り、すぐに最新版に切り替える人は多くないと思われる。\
自分も含め、COM ポートのようなレガシデバイスを主として使用する人は、最新版にする必要性を感じない。\
このため、プラグインとしてはしばらくは両メジャーバージョンに対応したい。
プラグインのソースコードは、は、可能な限り同じとし、v4 用、Tera Term 5 用に別々にビルドすることで対応する。\
v4 用のビルドは、コンパイラのオプション **-DTT4** を指定する。
## 「内部コードの Unicode 対応」について
v4 以前は、内部コードは基本的にバイト文字で動作していた。\
Tera Term 5 では、一部を除いてバイト文字は廃止し、ワイド文字(Unicode)に変更。
Unicode 化しない機能:
* 通信データ\
通信データはバイト列として扱うため変更対象外。
* 実行環境変数(TTset, ComVar)\
※ 将来的にはワイド文字になると思われる。
* 設定ファイル(TERATERM.INI, KEYBOARD.CNF, cygterm.cfg)\
※ GetPrivateProfileStringW 関数で自動的にワイド文字に変換して取得する。\
※ GetPrivateProfileStringA 関数で明示的にバイト文字で取得する。
1. tchar.h インクルード
2. コンパイルオプション **-DUNICODE**, **-D_UNICODE** を指定
3. 文字列用の変数の型を修正
| v4 以前 | Tera Term 5 |
|-|-|
|char | TCHAR |
|char * | LPTSTR |
|const char * | LPCTSTR |
|||
4. 対象の文字列は、 **_T( )** で括る
5. 文字列操作関数は、 tchar.h の関数に置き換え
* strxxx → _tcsxxx (※xxxはいろいろな関数名)
* atoi → _tstoi
* strlen → _tsnlen
* snprintf_s → sntprintf_s
6. セキュア対策していない文字列関数はこの際セキュア対策
7. 引数の文字列サイズを型に対応\
sizeof(buf) → sizeof(buf)/sizeof(buf[0])\
sizeof(buf) → sizeof(buf)/sizeof(TCHAR)\
p = malloc(len) → p = (LPTSTR)malloc(len*sizeof(TCHAR))
8. プラグイン呼び出し関数の引数の型は、マクロを使用\
プラグイン呼び出し関数の引数は const の扱いが異なるため、\
単純置き換えはワーニングになる。このため、両対応のマクロを使用する。
| v4 以前 | Tera Term 5 | 両対応プラグイン |
|-|-|-|
|char * | wchar_t * | TTX_LPTSTR |
|char * | const wchar_t * | TTX_LPCTSTR |
|||
## 「設定ファイルの保存先の変更」について
v4 では、VirtualStore 機能により、プログラムファイルフォルダの TeraTerm フォルダの下に設定ファイルがあるように見せていた。\
Tera Term 5 では AppData/Roaming/teraterm5 フォルダの下に移動した。\
その他の設定ファイルは、インストール時から変化しないのでこの対象ではない。\
プラグインとしては、大きく対応は必要ない。Roamingフォルダは階層が深く、\
テキストボックスで表示するととても長い。
何かしらの対策が欲しい。(T.B.D.)
各種パスの取得・設定は、ヘルパ関数を使用する。(ttxcommon.h参照)
| 項目 | 関数 | 説明 |
|-|-|-|
|パス取得 | TTXGetPath(ts, id) | 設定変数 ts から id で指定したパスを取得する。
取得したパスは TTXFree() で破棄する|
|パス設定 | TTXSetPath(ts, id, s) | 設定変数 ts から id で指定したパスに s を設定する。 |
|||
//path string
enum {
ID_HOMEDIR = 1,
ID_SETUPFNAME = 2,
ID_KEYCNFNM = 3,
ID_LOGFN = 4,
ID_MACROFN = 5,
ID_UILANGUAGEFILE = 6,
ID_UILANGUAGEFILE_INI = 7,
ID_EXEDIR = 8,
ID_LOGDIR = 9,
ID_STRMAX,
};
LPTSTR TTXGetPath(PTTSet ts, UINT uid);
BOOL TTXSetPath(PTTSet ts, UINT uid, LPTSTR s);
BOOL TTXFree(LPVOID *pBuf);
TTXFree() 関数は、文字列を格納したポインタ変数のアドレスを引数に渡す。\
ポインタの指すメモリを解放し、ポインタ変数は NULL に設定する。
## 「パス文字列の MAX_PATH(=260) 文字数の撤廃」について
v4 以前は、スタック上に MAX_PATH バイトの配列を用意して使用していた。
Tera Term 5 では動的に必要分だけ用意し、使用が終わったら破棄する。
動的な文字列領域の取得は、基本的に **malloc()** 関数を使用する。\
文字列のタイプを変換を伴うことが多いため、次のヘルパ関数を使用する。(ttxcommon.h参照)
### LPTSTR文字列の関数
| 項目 | 関数 | 説明 |
|-|-|-|
|LPTSTR 文字列複製| _tcsdup(pszSrc) | LPTSTR 文字列を複製する。
取得した文字列は free() で破棄する|
|バイト文字列取得| toMB(pszSrc) | LPTSTR 文字列からバイト文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|ワイド文字列取得| toWC(pszSrc) | LPTSTR 文字列からワイド文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|||
### ワイド文字列の関数
| 項目 | 関数 | 説明 |
|-|-|-|
|ワイド文字列からバイト文字列取得| WC2MB(cp, pwzSrc) | ワイド文字列から指定したコードページ cp の
バイト文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|ワイド文字列からバイト文字列取得
(バイト文字列はOSの標準)| WC2ACP(pwzSrc) | ワイド文字列からバイト文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|ワイド文字列からバイト文字列取得
(バイト文字列はUTF-8)| WC2UTF8(pwzSrc) | ワイド文字列からバイト文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|||
### バイト文字列の関数
| 項目 | 関数 | 説明 |
|-|-|-|
|バイト文字列からワイド文字列取得| MB2WC(cp, pwzSrc) | 指定したコードページ cp のバイト文字列から
ワイド文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|バイト文字列からワイド文字列取得
(バイト文字列はOSの標準)| ACP2WC(cp, pwzSrc) | バイト文字列からワイド文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|バイト文字列からワイド文字列取得
(バイト文字列はUTF-8)| UTF82WC(cp, pwzSrc) | バイト文字列からワイド文字列を取得する。
取得した文字列は TTXFree() で破棄する|
|||
## 「Windows 95 のサポート終了」について
Windows 95 用のビルドをサポートしない。
v4 では、**DllMain()** 関数に、**DoCover_IsDebuggerPresent()** を入れるため、
compat_w95.h をインクルードしていたが、Windows95 は確認出来なかった。\
サポート外となったため、削除。v4 でも無くても Windows10 は動作している。
## 「実行環境変数(TTset, ComVar)の構造変更」について
プラグインから見れば、どのバージョンの Tera Term でも同じプラグインを使えるのが望ましい。\
しかしながら、Tetra Term 本体からすれば、機能を追加・更新により実行環境変数の構造は変わってきてしまう。\
できれば、同じメジャーバージョンでの実行環境変数(TTset, ComVar)は、末尾に追加していくだけにしてほしい。
v4 から Tera Term 5 になるにあたって、将来追加する可能性がある箇所に予約領域を設けてくれた。\
v4 と Tera Term 5 で構造は異なるが、Tera Term 5 内では構造が保たれると考えられる。