Version ~ 2015.1.x
  $ZF() 関数で外部アプリケーションが起動できません(Windows Vista以降)

Windows Vista 以降の変更点に影響を受けているため、Windows XP 以前のアプリケーション実行方法では、動作しなくなりました。

【理由】 Windows XP 以前では、Windowsに最初にログインしたユーザが起動するプロセスは、Windows サービスやシステムと同一セッション(セッション 0) で動作していました。Windows Vista 以降から、最初にログインしたユーザが起動したプロセスであっても、Windows サービスとは別のセッションで稼働するように変更となりました。
※ マイクロソフトの以下ドキュメントをご参照ください。
セッション 0 の分離について


全ての Caché のジョブプロセスは、セッション 0 の元で実行される Caché サービスによって起動されます。
$ZF() 関数でセッションID を指定せずに外部アプリケーションを起動すると、Cachéサービス(セッション 0)とログインユーザが発行したプロセス(例:セッション 1)が異なるセッションとなるため、Cachéサービスがユーザデスクトップ(ユーザセッション)に対し、プロセスを起動させることができなくなります。
ユーザセッションIDを指定して、プロセスを起動させる方法の 1 つとして、Microsoft社が提供する、PsExecツールを使う方法があります。
※PsExec - PsTools のダウンロードはこちらから
 

// 電卓の起動
set st=$ZF(-100,"/ASYNC","C:\PSTools\PsExec.exe","-i","1","calc")
// PDFファイルを開く
set st=$ZF(-100,"/ASYNC","C:\PSTools\PsExec.exe","-i","1","C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe","c:\temp\test.pdf")


※PsExec.exe の引数 -i には、ユーザセッション ID を指定します。
※セッション番号は 1 以外の場合もあります。(例: Windows2008Server などのサーバマシンにリモートデスクトップで複数ユーザが接続する環境など)

Caché 2012.2以降であれば、ユーザセッションIDを以下のメソッド実行で取得することができます。(戻り値にID番号が返ります)

USER>w ##class(%SYSTEM.Util).GetSessionId()
1  // <--- ユーザセッションID
USER>


※ Caché 2012.2 より前のバージョンをお使いの環境では、Windowsのタスクマネージャでログインユーザ起動プロセスのセッションIDをご確認ください。


関連トピック:
添付ファイル:

アンケートにご協力をお願いします
このトピックは参考になりましたか?
このトピックに関するお問い合わせ

FAQトップに戻る