• <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)  編輯 收藏 引用
            <2010年10月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            C++

            MyFavorite

            搜索

            •  

            積分與排名

            • 積分 - 326080
            • 排名 - 75

            最新評論

            閱讀排行榜

            評論排行榜

            色诱久久av| 久久久久99精品成人片牛牛影视| 久久久久久精品成人免费图片| 欧美成a人片免费看久久| 久久婷婷色香五月综合激情| 亚洲国产精品综合久久一线| 伊人久久大香线蕉av不卡| 91精品国产高清91久久久久久| 久久99精品综合国产首页| 久久亚洲天堂| 国产国产成人精品久久| 亚洲欧美久久久久9999| 久久精品亚洲中文字幕无码麻豆 | 伊人久久五月天| 久久精品国产亚洲AV高清热| 办公室久久精品| 亚洲精品无码久久千人斩| 久久久久这里只有精品| 久久精品国产亚洲av高清漫画| 久久狠狠一本精品综合网| 久久久女人与动物群交毛片 | 久久久久久免费视频| 久久免费精品一区二区| 伊人久久大香线蕉综合Av| 久久久久九国产精品| 久久综合久久久| 欧美精品久久久久久久自慰| 久久大香萑太香蕉av| 久久久久久国产精品美女| 久久国产亚洲精品麻豆| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 日本久久中文字幕| 国内精品久久久久久久久| 青青青伊人色综合久久| 午夜精品久久久久久久久| 四虎国产精品成人免费久久| 亚洲精品WWW久久久久久| 国产—久久香蕉国产线看观看| 亚洲一区中文字幕久久| 99精品久久久久久久婷婷| 青青国产成人久久91网|