8

コンパイル済みの RemObjects Pascal スクリプトを実行時に Delphi にロードしようとしています。ただし、Delphi をロードしようとすると、「VALUE_TEAMCODE をインポートできません」という例外が表示されます。 Value_TeamCodePascal Script に登録済みの Delphi アプリの関数です。

これが私がやっていることです。以下の大まかな擬似コード - 実際のコードは複数のファイルに分割されています。また、SetCompiled以下の呼び出しは、スクリプトの実行が必要になったときにアプリ内でかなり後で発生します。

コードに関する注意: FPascalScriptTPSScriptDebugger

...

//Register custom functions with Pascal Script
FuncsRegister;  

//Load script
FPascalScript.Script.AddStrings(AContent);

//Compile script
FPascalScript.Compile;

//Get compiled script
FPascalScript.GetCompiled(sCompiledScript)

//Try and set script back in - ERROR Here 'Cannot Import VALUE_TEAMCODE'
FPascalScript.PascalScript.Debugger.SetCompiled(sCompiledScript);

...

多分私はこれについて間違っています。事前にコンパイルされたスクリプトをロードすることさえ可能かどうかはわかりません。

RemObjects WebSite Wiki で検索しましたが、Pascal Script のヘルプが削除されています。ここで StackOverflow のさまざまなトピックも検索しましたが、この問題に関連しているようには見えません。

もう一つメモ。実行時に問題なくコンパイルおよび実行するスクリプトが既にあります。パフォーマンス上の理由から、事前にコンパイルする必要があります。

どんな助けでも感謝します。

アップデート:

現在の回避策は、システム内のスクリプトごとに 1 つのスクリプト エンジンを使用することです。これらのエンジンは、プリコンパイル後もメモリに残ります。これにより、スクリプトのコンパイルごとに 30 ミリ秒のオーバーヘッドがなくなります。また、メモリを少し多く使用しますが、心配するほどではありません。

ただし、1 つのスクリプト エンジンだけを使用することをお勧めします (したがって、事前にコンパイルされたスクリプトを読み込む必要があります)。

4

2 に答える 2

1

RemObject Connect ベータ フォーラムでの回答のおかげで、解決策が見つかりました。(投稿についてはhttp://connect.remobjects.com/discussion/comment/13540#Comment_13540を参照してください)

ポスターvovanlに感謝します。

次のように、OnExecImport イベントを介して関数をインポートする必要がありました。

...

FPascalScript.OnExecImport := OnExecImport;
FPascalScript.SetCompiled(sCompiledScript);

...

TMyClass.OnExecImport(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter);
begin
  se.RegisterDelphiFunction(@Value_TeamCode, 'Value_TeamCode', cdRegister);
end;

...

SetCompiled は既存の登録をすべてクリアするように見えるため、OnExecImport をフックして関数、プロシージャ、メソッドなどを再登録する必要があります。

事前にコンパイルされたスクリプトをロードする (つまり、あるスクリプトを別のスクリプトに変更する) と、余分な時間のオーバーヘッドが追加されるように見えることに注意してください。私の最初の回避策は、実際には約 6 倍高速であることがわかりました。

于 2013-06-18T02:13:41.753 に答える
0

これの方法ではなく、なぜ?

コンパイルされたスクリプトは、おそらくバージョン バウンドであり、おそらくプラットフォーム/ターゲット バウンドでさえあります。通常は、時間の経過に気付かないほど高速にコンパイルされます。コンパイル時間が問題になるほどスクリプトを頻繁に使用していますか?

場合によっては、「本当にこれを行う必要がありますか?」というのが最良の答えになることもあります。

于 2013-06-14T07:33:04.307 に答える