作成者によってサポートされなくなった古いスクリプトエンジンを使用していて、メモリリークに問題があります。ASMで記述された関数を使用して、スクリプトからDelphi関数を呼び出し、結果を整数として返し、その整数を型なしパラメーターとして別のプロシージャに渡し、正しい型に変換します。
これはほとんどの場合正常に機能しますが、Delphi関数の戻り型がVariantの場合、Variantが破棄されないため、メモリリークが発生します。バリアントを含む型指定されていないパラメーターを取得して、適切に破棄されるようにする方法を知っている人はいますか?これには、おそらくインラインアセンブリが含まれます。
procedure ConvertVariant(var input; var output: variant);
begin
output := variant(input);
asm
//what do I put here? Input is still held in EAX at this point.
end;
end;
編集:コメントでロブケネディの質問に答える:
AnsiString変換は次のように機能します。
procedure VarFromString2(var s : AnsiString; var v : Variant);
begin
v := s;
s := '';
end;
procedure StringToVar(var p; var v : Variant);
begin
asm
call VarFromString2
end;
end;
これは正常に機能し、メモリリークは発生しません。入力パラメータとしてバリアントを使用して同じことをNull
実行し、2番目の手順で元のパラメータを割り当てようとすると、メモリリークが発生します。
バリアントには主に文字列が含まれており(問題のスクリプトはXMLを生成するために使用されます)、このスクリプトが呼び出しているDelphi関数のバリアントにDelphi文字列を割り当てることでそこに到達します。(この場合、関数の戻り型を変更しても機能しません。)