public void TestGetItem()
        {
            NativeTab tab = new NativeTab(testDlg.IdentifyFromDialogId(1022));

            TCITEM item = new TCITEM();
            item.mask = (TCIF.TEXT | TCIF.IMAGE | TCIF.PARAM | TCIF.STATE);
            item.dwStateMask = (TCIS.BUTTONPRESSED | TCIS.HIGHLIGHTED);

            tab.GetItem(0, item);
            Assert.AreEqual("a", item.pszText);
            Assert.AreEqual(0, item.iImage);
            Assert.AreEqual(new IntPtr(10), item.lParam);
            Assert.AreEqual(TCIS.BUTTONPRESSED, item.dwState);
            tab.GetItem(1, item);
            Assert.AreEqual("あ", item.pszText);
            Assert.AreEqual(1, item.iImage);
            Assert.AreEqual(new IntPtr(11), item.lParam);
            Assert.AreEqual((TCIS)0, item.dwState);
        }
        /// <summary>
        /// アイテムを取得します。
        /// </summary>
        /// <param name="handle">ウィンドウハンドル。</param>
        /// <param name="tabIndex">タブインデックス。</param>
        /// <param name="item">アイテム。</param>
        /// <returns>成否。</returns>
        private static bool GetItemInTarget(IntPtr handle, int tabIndex, TCITEM item)
        {
            bool isUni = NativeMethods.IsWindowUnicode(handle);
            int TCM_GETITEM = isUni ? TCM_GETITEMW : TCM_GETITEMA;
            item._core.cchTextMax = 256;
            while (true)
            {
                //メモリを確保。
                if ((item.mask & TCIF.TEXT) != 0)
                {
                    item._core.pszText = Marshal.AllocCoTaskMem((item._core.cchTextMax + 1) * 8);
                }
                try
                {
                    //データ取得。
                    if (!NativeDataUtility.ToBool(NativeMethods.SendMessage(handle, TCM_GETITEM, new IntPtr(tabIndex), ref item._core)))
                    {
                        return false;
                    }

                    //文字列取得でなければ終了
                    if ((item.mask & TCIF.TEXT) == 0)
                    {
                        return true;
                    }

                    //文字列に変換
                    item._pszText = isUni ? Marshal.PtrToStringUni(item._core.pszText) :
                                            Marshal.PtrToStringAnsi(item._core.pszText);

                    //文字バッファが足りなければリトライ。
                    if (item.pszText.Length < item._core.cchTextMax - 1)
                    {
                        return true;
                    }
                    item._core.cchTextMax *= 2;
                }
                finally
                {
                    //メモリ解放。
                    if (item._core.pszText != IntPtr.Zero)
                    {
                        Marshal.FreeCoTaskMem(item._core.pszText);
                    }
                }
            }
        }
        /// <summary>
        /// Obtains tab item data.
        /// </summary>
        /// <param name="tabIndex">Tab index.</param>
        /// <returns>Item data.</returns>
#else
        /// <summary>
        /// アイテムデータを取得します。
        /// </summary>
        /// <param name="tabIndex">タブインデックス。</param>
        /// <returns>アイテムデータ。</returns>
#endif
        public IntPtr GetItemData(int tabIndex)
        {
            TCITEM item = new TCITEM();
            item.mask = TCIF.PARAM; 
            return GetItem(tabIndex, item) ? item.lParam : IntPtr.Zero;
        }
        /// <summary>
        /// Gets a certain tab item.
        /// </summary>
        /// <param name="tabIndex">Tab index.</param>
        /// <param name="item">Item storage buffer.</param>
        /// <returns>Success or failure.</returns>
#else
        /// <summary>
        /// アイテムを取得します。
        /// </summary>
        /// <param name="tabIndex">タブインデックス</param>
        /// <param name="item">アイテム格納バッファ</param>
        /// <returns>成否</returns>
#endif
        public bool GetItem(int tabIndex, TCITEM item)
        {
            AppVar inTarget = App.Dim(item);
            bool ret = (bool)App[GetType(), "GetItemInTarget"](Handle, tabIndex, inTarget).Core;
            TCITEM getData = (TCITEM)inTarget.Core;
            item._core = getData._core;
            item.pszText = getData.pszText;
            return ret;
        }
        /// <summary>
        /// Obtains the text for a certain tab item.
        /// </summary>
        /// <param name="tabIndex">Tab index.</param>
        /// <returns>Tab text.</returns>
#else
        /// <summary>
        /// 文字列を取得します。
        /// </summary>
        /// <param name="tabIndex">タブインデックス。</param>
        /// <returns>タブ文字列。</returns>
#endif
        public string GetItemText(int tabIndex)
        {
            TCITEM item = new TCITEM();
            item.mask = TCIF.TEXT;
            return GetItem(tabIndex, item) ? item.pszText : string.Empty;
        }