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

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

判定関数(デフォルトエンコードして戻して比較)
  1. function IsDefaultCodePageCompatible(const S: string): Boolean;  
  2. var  
  3.     EncodedBytes: TBytes;  
  4. begin  
  5.     try  
  6.         EncodedBytes := TEncoding.default.GetBytes(S);  
  7.         Result := (S = TEncoding.default.GetString(EncodedBytes));  
  8.     except  
  9.         on E: Exception do begin  
  10.             Result := False;  
  11.         end;  
  12.     end;  
  13. end;  

コメント