Windows Script Host を介して JScript スクリプト (.js ファイル内) を実行するプロセスを生成する Windows ローカル サービスがあります。問題は、.js ファイル内のスクリプトによって生成された結果をサービスに通知する必要があることです。転送または単純な 32 ビット整数、または文字列で十分です。これを行う方法は何ですか?
PS。コードは、Windows XP SP3 以降の OS で実行する必要があります。
Windows Script Host を介して JScript スクリプト (.js ファイル内) を実行するプロセスを生成する Windows ローカル サービスがあります。問題は、.js ファイル内のスクリプトによって生成された結果をサービスに通知する必要があることです。転送または単純な 32 ビット整数、または文字列で十分です。これを行う方法は何ですか?
PS。コードは、Windows XP SP3 以降の OS で実行する必要があります。
最善の策は、サービス内で実行されるプロセス外 COM オブジェクトを作成することです。必要なスクリプト インターフェイスを実装し、通知に一致するメンバー関数を提供して、スクリプトから次のように呼び出します。
newObj = new ActiveXObject("localserver.mynotify");
newObj.Notify("finished");
スクリプトはJScriptで記述されており、アプリはC++で記述されているようです。
おそらく、あなたが望むことを達成するための最も簡単な方法は、たとえば、サービスがアクセスする必要のあるprogramdataフォルダーにファイルを書き込むことです。たぶん、特定のリクエストにGUIDを使用し、それをJScriptに渡して、一意のファイルであることが保証されるようにします。理想的ではありません。
JScript出力を取得する別の方法...マネージコード(C#)を呼び出すことはできますか?その場合は、.NETベースまたは.NET呼び出し可能なJavaScriptコンパイラー/インタープリターを使用できます。これにより、IActiveScriptを回避し、スクリプトコンテキストまたは関数の戻り値から値を取得することもできます。私はJurassicとJavaScriptDotNetを使用しましたが、どちらも非常に使いやすく、拡張も簡単です。
これは、ActiveXObject呼び出し(つまり、FileSystemObject)に大きく依存していて、コンポーネントを作成したくない場合に問題を引き起こす可能性があります。JuraScriptはJurassicエンジンをラップし、COM自動化のためにActiveXObjectサポートを追加します。
私はC++の初心者なので、マネージ/ C ++間で相互運用できることは知っていますが、これがあなたにとってどれほどの飛躍であるかはわかりません。
回答にリストされていないので、これらのシナリオについて言及しようと思っただけです。
.js ファイルを外部プロセスとして実行する必要がありますか? Windows Scripting には、アプリが独自のプロセス内でスクリプトを実行するために使用できる COM オブジェクトがあります。これを使用して、サービス プロセス内でスクリプト ファイルを実行しましたが、正常に動作します。ホスティング プロセスは、独自の にIDispatch
基づくクラスを実装し、それらをスクリプト エンジンに渡して、グローバル オブジェクトとしてスクリプトに公開することもできます。これにより、スクリプトは、これらのオブジェクトを使用しnew ActiveXObject
たりCreateObject()
アクセスしたりすることなく、ホスティング プロセスと通信できます。