Delphi の TDdeClientConv と TDdeServerConv の受け渡しでデフォルトコートページ以外の文字列を受け渡す

 Delphi の TDdeClientConv と TDdeServerConv 間の文字列受け渡しでデフォルトコートページ以外の文字を含むとデータが破損して渡されてしまう
(Unicodeにしか存在しない文字を使用したファイルパスを受け渡す等)

原因は Vcl.DdeMan が Unicode化されておらず ExecuteMacro関数の引数が PAnsiChar となっているため、UTF-8 の文字列を AnsiChar へ変換してから送信している

Unicode版へ書き直すのが正しいのだろうが
自身のアプリケーション間であれば base64 でエンコードして送信、受信してデコードすればよい

System.NetEncoding の
TNetEncoding.Base64.Encode
TNetEncoding.Base64.Decode

デフォルトコートページ内で収まらない文字列のときだけエンコードする場合は、判定後に送信文字列にヘッダなどを付与する

判定関数(デフォルトエンコードして戻して比較)
function IsDefaultCodePageCompatible(const S: string): Boolean;
var
    EncodedBytes: TBytes;
begin
    try
        EncodedBytes := TEncoding.default.GetBytes(S);
        Result := (S = TEncoding.default.GetString(EncodedBytes));
    except
        on E: Exception do begin
            Result := False;
        end;
    end;
end;

コメント