Esempio n. 1
0
 internal void EndSystem()
 {
     //フタイミングによっては相手アプリケーションが存在しないことは十分にありうる
     try
     {
         CopyDataProtocolTalker.SendAndRecieve(_systemControlWindowInAppHandle,
                                               new SystemControlInfo(SystemControlType.EndSystem, null));
     }
     catch { }
 }
Esempio n. 2
0
 internal void EndFriendlyConnector(IntPtr friendlyConnectorWindowInApp)
 {
     //タイミングによっては相手アプリケーションが存在しないことは十分にありうる
     try
     {
         CopyDataProtocolTalker.SendAndRecieve(_systemControlWindowInAppHandle,
                                               new SystemControlInfo(SystemControlType.EndFriendlyConnectorWindowInApp, friendlyConnectorWindowInApp));
     }
     catch { }
 }
        /// <summary>
        /// 非同期状態に関する通信。
        /// 非同期結果バッファの初期化と、完了の問い合わせ。
        /// 対象アプリケーション内でコントロールスレッドで実行される。
        /// </summary>
        /// <param name="info">呼び出し情報。</param>
        /// <param name="receiveWindow">受信ウィンドウ。</param>
        /// <returns>戻り値。</returns>
        private ReturnInfo AsyncState(ProtocolInfo info, ReceiveAfterSend receiveWindow)
        {
            ReturnInfo ret = CopyDataProtocolTalker.SendAndRecieve(_friendlyConnectorWindowInAppHandleAsync, info, receiveWindow) as ReturnInfo;

            if (ret == null)
            {
                throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorAppCommunication);
            }
            return(ret);
        }
Esempio n. 4
0
        /// <summary>
        /// FriendlyConnector開始。
        /// </summary>
        /// <param name="executeThreadWindowHandle">実行対象スレッドに属するウィンドウハンドル。</param>
        /// <returns>FriendlyConnector。</returns>
        internal FriendlyConnectorCore StartFriendlyConnector(IntPtr executeThreadWindowHandle)
        {
            //通信用ウィンドウを生成
            IntPtr friendlyConnectorWindowInApp = (IntPtr)CopyDataProtocolTalker.SendAndRecieve(_systemControlWindowInAppHandle,
                                                                                                new SystemControlInfo(SystemControlType.StartFriendlyConnectorWindowInApp, executeThreadWindowHandle));

            if (friendlyConnectorWindowInApp == IntPtr.Zero)
            {
                throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorExecuteThreadWindowHandle);
            }
            return(new FriendlyConnectorCore(_friendlyConnectorWindowInAppAsync, friendlyConnectorWindowInApp));
        }
Esempio n. 5
0
        /// <summary>
        /// コンストラクタ。
        /// </summary>
        /// <param name="systemControlWindowInAppHandle">システムコントロールウィンドウハンドル。</param>
        internal SystemController(IntPtr systemControlWindowInAppHandle)
        {
            _systemControlWindowInAppHandle = systemControlWindowInAppHandle;

            //コントロールスレッドに非同期通信用を一つ確保する
            _friendlyConnectorWindowInAppAsync = (IntPtr)CopyDataProtocolTalker.SendAndRecieve(_systemControlWindowInAppHandle,
                                                                                               new SystemControlInfo(SystemControlType.StartFriendlyConnectorWindowInApp, _systemControlWindowInAppHandle));
            if (_friendlyConnectorWindowInAppAsync == IntPtr.Zero)
            {
                throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorExecuteThreadWindowHandle);
            }
        }
        /// <summary>
        /// 同期実行。
        /// しかし、Windowsの場合、操作実行は非同期で実行しないと、稀にに操作中にSendMessageが失敗してしまう操作がある。
        /// そのため、非同期操作のプロトコルを使って、実行させ、終了するのを待つ。
        /// </summary>
        /// <param name="info">呼び出し情報。</param>
        /// <param name="receiveWindow">受信ウィンドウ。</param>
        /// <returns>戻り値。</returns>
        private ReturnInfo Operation(ProtocolInfo info, ReceiveAfterSend receiveWindow)
        {
            //完了の成否確認用
            ReturnInfo isComplete = SendForExecuteContext(new ProtocolInfo(ProtocolType.VarInitialize, null, null, string.Empty, string.Empty, new object[] { null }), receiveWindow);

            if (isComplete.Exception != null)
            {
                return(isComplete);
            }

            //引数の先頭に存在確認フラグを挿入
            List <object> arg = new List <object>();

            arg.Add(isComplete.ReturnValue);
            arg.AddRange(info.Arguments);

            //非同期実行
            ReturnInfo retValue = SendForExecuteContext(new ProtocolInfo(ProtocolType.AsyncOperation, info.OperationTypeInfo, info.VarAddress, info.TypeFullName, info.Operation, arg.ToArray()), receiveWindow);

            if (retValue.Exception != null)
            {
                return(retValue);
            }

            //処理が完了するのを待つ
            VarAddress complateCheckHandle = (VarAddress)isComplete.ReturnValue;
            int        sleepTime           = 1;

            while (true)
            {
                //結果の確認は実行対象スレッド以外で実施する。
                //処理が完了するまで、そのスレッドには割り込まない。
                ReturnInfo ret = CopyDataProtocolTalker.SendAndRecieve(_friendlyConnectorWindowInAppHandleAsync,
                                                                       new ProtocolInfo(ProtocolType.IsEmptyVar, null, null, string.Empty, string.Empty, new object[] { complateCheckHandle })
                                                                       , receiveWindow) as ReturnInfo;
                if (ret == null)
                {
                    throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorAppCommunication);
                }
                if (!(bool)ret.ReturnValue)
                {
                    break;
                }
                Thread.Sleep(sleepTime);
                sleepTime++;
                if (100 < sleepTime)
                {
                    sleepTime = 100;
                }
            }

            //結果を取得
            ReturnInfo checkComplate = SendForExecuteContext(new ProtocolInfo(ProtocolType.GetValue, null, complateCheckHandle, string.Empty, string.Empty, new object[0]), receiveWindow);

            if (checkComplate.Exception != null)
            {
                return(checkComplate);
            }
            ReturnInfo checkComplateCore = checkComplate.ReturnValue as ReturnInfo;

            if (checkComplateCore == null)
            {
                throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorAppCommunication);
            }
            if (checkComplateCore.Exception != null)
            {
                return(checkComplateCore);
            }

            //解放
            NativeMethods.SendMessage(_friendlyConnectorWindowInAppHandle, FriendlyConnectorWindowInApp.WM_BINOFF, new IntPtr(complateCheckHandle.Core), IntPtr.Zero);

            //戻り値を返す
            return(retValue);
        }