• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 126,  comments - 73,  trackbacks - 0
            BSTR 設計對于 C++ 程序員好壞參半。一方面, BSTR 可以被用于大多數需要 OLECHAR 數組作為參數的函數。另一方面,不能用熟悉的 C/C++ 函數進行對 BSTR 的分配、釋放和處理,例如 malloc, free, new, delete, lstrcat, and lstrlen 等函數不能用于處理 BSTR 。就像對接口指針和類指針的處理不一樣,對 BSTR 的處理和對 TCHAR* 的處理也不一樣。 BSTR 是一種 C 語言方式的類型定義方式,這種定義方式提高了 BSTR C++ 的應用效率,但是也帶來了很多的潛在風險,它使程序員失去了利用編譯器檢查潛在問題的機會。
            1.2 ????? BSTR 使用基本規則
            ?
            • 在對 BSTR 進行讀取操作的時候,可以把 BSTR 看作 OLECHAR 數組。 BSTR 可以用于 const wchar_t*( LPCTSTR/ LPCWSTR/ cosnt TCHAR*/ cosnt WCHAR* in Unicode project ) ,不能用于 需要 wchar_t* ( LPTSTR/ LPWSTR/ TCHAR*/ WCHAR* in Unicode project ) 的地方。
            • 如果有相應的 BSTR 處理函數,必須使用 BSTR 處理函數,不要使用普通字符串函數。特別是一個 BSTR 包含多個字符串 ( 也就是,包含多個 0 結束符 ) 的情況。 在對 BSTR 進行修改(包括創建和釋放時),必須使用 BSTR 的專用函數。主要要保證對字符長度前綴的正確修改。不要直接讀取 BSTR 的長度域,應該使用 BSTR 處理函數計算長度。
            ?
            String Manipulation Functions ????
            Descriptions
            SysAllocString
            Creates and initializes a string.
            SysAllocStringByteLen
            Creates a zero-terminated string of a specified length.
            SysAllocStringLen
            Creates a string of a specified length.
            SysFreeString
            Frees a previously created string.
            SysReAllocString
            Changes the size and value of a string.
            SysReAllocStringLen
            Changes the size of an existing string.
            SysStringByteLen
            Returns the length of a string in bytes.
            SysStringLen
            Returns the length of a string.
            ?
            • NULL BSTR 的有效值。按照約定,它可以被看作含有 0 個字符的字符串。 BSTR 變量必須等于 NULL ,或者正確分配的 BSTR 指針。在改變 BSTR 變量的之前,必須釋放原來指向的 BSTR 不要把 BSTR 直接初始化成常量字符指針,例如, BSTR?bs = L””
            • Automation cache BSTR 使用的空間,以提高 SysAllocString/SysFreeString 的性能,會給測試發現問題帶來困難。如果可能推薦在調試時使用 Compuware DevPartner 7.x 及更高版本的工具。
            ?
            1.3 ????? BSTR 參數使用
            多數時候, BSTR 是被用于函數參數。關于 BSTR 參數的使用規則是 BSTR 類型的基礎。只有熟練掌握,才能分析 warpper 類或轉換函數的正確性。
            ?
            ? 基本原則:在給 by-reference[in/out] 參數賦一個新的值前,被調用者負責釋放。其他情況,都是調用者負責釋放。
            ?
            調用者使用 BSTR 的規則如下:
            ·???????? 釋放被調用函數返回的 BSTR ,或者被調用函數通過 by-reference 返回的 BSTR
            HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr );
            //...
            BSTR bstrStatus;
            pBrowser->get_StatusText( &bstrStatus );
            ?
            // shows using the Win32 function
            // to freee the memory for the string:
            ::SysFreeString( bstrStatus );
            ?
            ·???????? 釋放通過 by-value 方式傳給其他函數的 BSTR.
            //.h
            HRESULT IWebBrowser2::put_StatusText( BSTR bstr );
            ?
            //.cpp
            // shows using the Win32 function
            // to allocate memory for the string:
            BSTR bstrStatus = ::SysAllocString( L"Some text" );
            if (bstrStatus == NULL)
            ?? return E_OUTOFMEMORY;
            ?
            pBrowser->put_StatusText( bstrStatus );
            // Free the string:
            ::SysFreeString( bstrStatus );
            //...
            ?
            被調用者按照如下規則處理 BSTR
            ·???????? 如果一個 BSTR 參數是 by-reference 方式,在給參數賦新值之前, Free 以前的值。如果沒有給參數賦的新值,不要 Free 傳入值。
            void RefreshBSTR(BSTR& bs)
            // bs is an [in/out] parameter. BSTR* is the same
            {
            // using the bs here
            Dosomething(bs);
            // if (bs is about to be updated)
            ASSERT(bs != NULL);
            ::SysReallocString(bs, _T(“NEW STRING”));
            // SysReallocString will call SysFreeString and
            // SysAllocString in sequence
            // If bs is only [out] parameter, SysAllocString
            // should be called here.
            }
            ?
            ·???????? 不要 Free 通過 by-value 傳入的 BSTR
            void SetBSTR(BSTR bs)
            // bs is an [in] parameter. BSTR* is the same
            {
            // using the bs here
            Dosomething(bs);
            ::SysFreeString(bs); //ERROR
            }
            ?
            ·???????? 不要 Free 返回給調用者的 BSTR .
            BSTR GetBSTR1()
            {
            BSTR bs = ::SysAllocString(_T(“test”));
            ::SysFreeString(bs); //ERROR
            return bs;
            }
            ?
            void GetBSTR2(BSTR* pBs)
            {
            CComBSTR bs(_T(“test”));
            *pBS = (BSTR) bs; //ERROR: pBS will be freed automatically
            }
            ?
            ·???????? 如果需要保存傳入的 BSTR ,被調用著需要用 SysAllocString() 生成一個新的副本,并保存。輸入的 BSTR 會被調用者釋放。
            void MyClass::SetBSTR(BSTR bs)
            {
            //BSTR m_bs;
            m_bs = bs; //ERROR
            m_bs = ::SysReAllocString(bs);
            }
            ·???????? 如果需要返回一個已經存儲的 BSTR ,返回 BSTR 的一個拷貝。調用者釋放返回的 BSTR 拷貝。
            void MyClass::GetBSTR(BSTR* pbs)
            {
            //BSTR m_bs;
            *pbs = m_bs; //ERROR
            *pbs = ::SysAllocString(m_bs);
            }
            ?


            From: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1486367

            posted on 2007-01-26 16:06 我風 閱讀(1353) 評論(0)  編輯 收藏 引用
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            C++

            MyFavorite

            搜索

            •  

            積分與排名

            • 積分 - 326120
            • 排名 - 75

            最新評論

            閱讀排行榜

            評論排行榜

            狼狼综合久久久久综合网| 日日狠狠久久偷偷色综合0| 97久久天天综合色天天综合色hd| 狠狠色丁香婷婷综合久久来| 国产成人久久777777| 久久亚洲国产成人影院| 亚洲国产欧洲综合997久久| 亚洲综合精品香蕉久久网97 | 久久99精品国产麻豆蜜芽| 久久久久久A亚洲欧洲AV冫| 亚洲色婷婷综合久久| 色综合久久综精品| 久久精品人妻中文系列| 国产AⅤ精品一区二区三区久久| 人人妻久久人人澡人人爽人人精品| 久久精品国产99久久久| 国产欧美久久久精品影院| 国产精品99久久精品爆乳| 久久精品国产第一区二区三区| 一本一道久久a久久精品综合 | 日日狠狠久久偷偷色综合0| 久久99热精品| 91精品国产9l久久久久| 久久精品国产99久久香蕉| 国产成人久久激情91| 九九久久自然熟的香蕉图片| 久久人做人爽一区二区三区 | 色欲综合久久中文字幕网| 亚洲人成无码www久久久| 久久e热在这里只有国产中文精品99| 久久精品水蜜桃av综合天堂 | 亚洲国产天堂久久综合网站| 中文字幕热久久久久久久| 国产亚洲精久久久久久无码77777| 久久精品成人影院| 久久久久亚洲AV无码专区桃色| 精品国产婷婷久久久| 久久久99精品成人片中文字幕| 狠狠色伊人久久精品综合网| 狠狠色丁香久久婷婷综| 久久久久免费精品国产|