先程は簡単な Form を Activity 内部から呼び出して値の受け渡しを行いました。今度は Activity とは無縁のコンソールアプリケーションを起動し、その戻り値を受けわたしてみます。
今回の Workflow はこのような形です。新しく自作した Activity は ExecuteApplicationActivity となっている、指定したアプリケーションを実行しその戻り値を返却するための Activity となっています。CodeReceipe にもサンプルとして投稿してありますが、それを少々自分用にカスタマイズを行っています。例外処理についてはサンプルという事でご勘弁を・・・
Public Property TargetFile As String = ""
Public Property ResultCode As Activities.OutArgument(Of Integer)Private _executer As New Common.Executer '自前のAP実行用クラス
Protected Overrides Sub Execute(ByVal context As NativeActivityContext)
Try
Dim targetFileStrings As String = ControlChars.Quote + Me.TargetFile + ControlChars.Quote
If Me.Arguments.Trim <> "" Then
targetFileStrings += " " + Me.Arguments
End If
'アプリケーションの起動
'Execute application
_executer.ExecuteProcessWait(targetFileStrings, "", True)context.SetValue(ResultCode, _executer.ResultCode(0))
Catch ex As Exception
End Try
End Sub
自前で用意している AP 実行用のクラスは内部で単純に Process クラスを用いて実行しているだけと思ってください。そして今回用意したシンプルに戻り値を戻すコンソールアプリケーションは次のようなロジックです。
Function Main() As Integer
Dim targetTime As Integer = Now.Second
Return targetTimeEnd Function
起動した際に現在の秒を返却しているだけ、という非常にシンプルなものとなっています。先程の ExecuteApplicationActivity で上記コンソールアプリケーションを起動させるようにプロパティとして設定、Workflow の変数として戻り値を受け取るための Int32 型の変数を一つ作成し、ExecuteApplicationActivity、Display 双方のプロパティに設定します。現在用意している DisplayActivity では、表示させる値を扱うプロパティは InArgument(Of String) として定義していますので、デザイナーのプロパティダイアログ上では [変数].ToString と設定してあげる必要があります。
Workflowを実行すると上記のように、コンソールアプリケーション実行の結果がDisplay Activityによって表示されたのが確認できます。このように Context を通して値をやりとりするので、既存 AP を Workflow から利用しようと考えた場合でも、出力用インターフェース仕様を決めてしまえば、後はそれほど手間が発生しなくなります。非常に簡単に Workflow に組み込めるのが体感できるのではないでしょうか。
0 件のコメント:
コメントを投稿