Exemple #1
0
        /// <summary>
        /// 『ごちゃまぜドロップス』の共有メモリ情報を読み取る。
        /// </summary>
        /// <param name="dest">読み取った情報の設定先。</param>
        /// <returns>処理結果。</returns>
        public static Result Read(out GcmzInfo dest)
        {
            dest = null;

            var handle      = IntPtr.Zero;
            var dataAddress = IntPtr.Zero;

            try
            {
                // ファイルマッピングハンドル取得
                handle = OpenFileMapping(FILE_MAP_READ, false, FileMapName);
                if (handle == IntPtr.Zero)
                {
                    return(Result.FileMappingFail);
                }

                // ファイルマッピングアドレス取得
                dataAddress = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, UIntPtr.Zero);
                if (dataAddress == IntPtr.Zero)
                {
                    return(Result.MapViewFail);
                }

                // データ取得
                var data =
                    (GcmzInfo.Data)Marshal.PtrToStructure(
                        dataAddress,
                        typeof(GcmzInfo.Data));

                dest = new GcmzInfo(ref data);
            }
            finally
            {
                if (dataAddress != IntPtr.Zero)
                {
                    UnmapViewOfFile(dataAddress);
                }
                if (handle != IntPtr.Zero)
                {
                    CloseHandle(handle);
                }
            }

            return(Result.Success);
        }
Exemple #2
0
        /// <summary>
        /// 『ごちゃまぜドロップス』の共有メモリ情報を読み取り、状態を検証する。
        /// </summary>
        /// <param name="dest">共有メモリ情報の設定先。</param>
        /// <param name="tryRead0312">
        /// 『ごちゃまぜドロップス』 v0.3.12 以降の共有メモリ情報読み取りを試みるならば true 。
        /// </param>
        /// <returns>検証結果。</returns>
        private static Result ReadAndValidateGcmzInfo(
            out GcmzInfo dest,
            bool tryRead0312 = false)
        {
            dest = null;

            switch (GcmzInfoReader.Read(out dest, tryRead0312))
            {
            case GcmzInfoReader.Result.Success:
            {
                if (!dest.IsWindowOpened)
                {
                    return(Result.GcmzWindowNotFound);
                }
                if (!dest.IsProjectOpened)
                {
                    return(Result.ProjectNotFound);
                }
                if (!new Win32Window(dest.WindowHandle).IsExists)
                {
                    return(Result.GcmzWindowNotFound);
                }
            }
            break;

            case GcmzInfoReader.Result.FileMappingFail:
                return(Result.FileMappingFail);

            case GcmzInfoReader.Result.MapViewFail:
                return(Result.MapViewFail);

            default:
                // 来ないはず…
                return(Result.Fail);
            }

            return(Result.Success);
        }
        /// <summary>
        /// 『ごちゃまぜドロップス』の共有メモリ情報を読み取る。
        /// </summary>
        /// <param name="dest">読み取った情報の設定先。</param>
        /// <param name="tryRead0312">
        /// 『ごちゃまぜドロップス』 v0.3.12 以降の共有メモリ情報読み取りを試みるならば true 。
        /// </param>
        /// <returns>処理結果。</returns>
        public static Result Read(out GcmzInfo dest, bool tryRead0312 = false)
        {
            dest = null;

            var handle      = IntPtr.Zero;
            var dataAddress = IntPtr.Zero;

            try
            {
                // ファイルマッピングハンドル取得
                handle = OpenFileMapping(FILE_MAP_READ, false, FileMapName);
                if (handle == IntPtr.Zero)
                {
                    return(Result.FileMappingFail);
                }

                // ファイルマッピングアドレス取得
                dataAddress = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, UIntPtr.Zero);
                if (dataAddress == IntPtr.Zero)
                {
                    return(Result.MapViewFail);
                }

                bool use0312 = false;
                if (tryRead0312)
                {
                    // ファイルマッピングサイズから GcmzInfo.Data0312 を利用できるか確認
                    var data0312Size = (uint)Marshal.SizeOf(typeof(GcmzInfo.Data0312));
                    var mapInfo      = new MEMORY_BASIC_INFORMATION();
                    var mapInfoSize  = new UIntPtr((uint)Marshal.SizeOf(mapInfo));
                    use0312 =
                        (VirtualQuery(dataAddress, ref mapInfo, mapInfoSize) == mapInfoSize) &&
                        (mapInfo.RegionSize.ToUInt64() >= data0312Size);
                }

                // データ取得
                if (use0312)
                {
                    var data =
                        (GcmzInfo.Data0312)Marshal.PtrToStructure(
                            dataAddress,
                            typeof(GcmzInfo.Data0312));
                    dest = new GcmzInfo(ref data);
                }
                else
                {
                    var data =
                        (GcmzInfo.Data)Marshal.PtrToStructure(
                            dataAddress,
                            typeof(GcmzInfo.Data));
                    dest = new GcmzInfo(ref data);
                }
            }
            finally
            {
                if (dataAddress != IntPtr.Zero)
                {
                    UnmapViewOfFile(dataAddress);
                }
                if (handle != IntPtr.Zero)
                {
                    CloseHandle(handle);
                }
            }

            return(Result.Success);
        }