/// <summary> /// 送受信。 /// </summary> /// <param name="targetWindowHandle">送信対象ウィンドウハンドル。</param> /// <param name="data">送信データ。</param> /// <returns>受信データ。</returns> internal static object SendAndRecieve(IntPtr targetWindowHandle, object data) { using (ReceiveAfterSend recieveWindow = new ReceiveAfterSend()) { return(SendAndRecieve(targetWindowHandle, data, recieveWindow)); } }
/// <summary> /// 送受信。 /// </summary> /// <param name="targetWindowHandle">送信対象ウィンドウハンドル。</param> /// <param name="data">送信データ。</param> /// <param name="recieveWindow">受信ウィンドウ。</param> /// <returns>受信データ。</returns> internal static object SendAndRecieve(IntPtr targetWindowHandle, object data, ReceiveAfterSend recieveWindow) { //通信番号生成 int communicationNo = 0; if (!recieveWindow.UniqueNoManager.CreateNo(out communicationNo)) { throw new InformationException(ResourcesLocal.Instance.OutOfCommunicationNo); } //使用可能なスレッドであるかチェック if (!recieveWindow.CanUseThread) { throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorInvalidThreadCall); } //送受信 IntPtr globalData = IntPtr.Zero; try { //通信データ作成 CopyDataProtocolInfo communicationData = new CopyDataProtocolInfo(recieveWindow.Handle, data); //シリアライズ byte[] bin = communicationData.Serialize(); //WM_COPYDATAでの送信用構造体に移し替え NativeMethods.COPYDATASTRUCT copyData = new NativeMethods.COPYDATASTRUCT(); copyData.dwData = IntPtr.Zero; copyData.cbData = (uint)bin.Length; copyData.lpData = globalData = Marshal.AllocHGlobal(bin.Length); Marshal.Copy(bin, 0, copyData.lpData, bin.Length); //送信 IntPtr sendRet = NativeMethods.SendMessage(targetWindowHandle, NativeMethods.WM_COPYDATA, new IntPtr(communicationNo), ref copyData); if (sendRet != ReceiveForm.SendCopyDataSuccess) { throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorAppCommunication); } //受信データ取得 object receiveData; if (!recieveWindow.GetReceiveData(communicationNo, out receiveData)) { throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorAppCommunication); } return(receiveData); } finally { //グローバルメモリ解放 if (globalData != IntPtr.Zero) { Marshal.FreeHGlobal(globalData); } recieveWindow.UniqueNoManager.FreeNo(communicationNo); } }