• <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>

            CreateFileMapping 函數(shù)

            內(nèi)存映射API函數(shù)CreateFileMapping創(chuàng)建一個(gè)有名的共享內(nèi)存:
            HANDLE CreateFileMapping(
            HANDLE hFile,                                                                        // 映射文件的句柄,
                                                                                                               //設(shè)為0xFFFFFFFF以創(chuàng)建一個(gè)進(jìn)程間共享的對(duì)象
            LPSECURITY_ATTRIBUTES lpFileMappingAttributes,   // 安全屬性
            DWORD flProtect,                                                                   // 保護(hù)方式
            DWORD dwMaximumSizeHigh,                                           //對(duì)象的大小
            DWORD dwMaximumSizeLow,
            LPCTSTR lpName                                                                 // 必須為映射文件命名
            );

            與虛擬內(nèi)存類似,保護(hù)方式可以是PAGE_READONLY或是PAGE_READWRITE。如果多進(jìn)程都對(duì)同一共享內(nèi)存進(jìn)行寫訪問,則必須保持相互間同步。映射文件還可以指定PAGE_WRITECOPY標(biāo)志,可以保證其原始數(shù)據(jù)不會(huì)遭到破壞,同時(shí)允許其他進(jìn)程在必要時(shí)自由的操作數(shù)據(jù)的拷貝。

            在創(chuàng)建文件映射對(duì)象后使用可以調(diào)用MapViewOfFile函數(shù)映射到本進(jìn)程的地址空間內(nèi)。

            下面說(shuō)明創(chuàng)建一個(gè)名為MySharedMem的長(zhǎng)度為4096字節(jié)的有名映射文件:
            HANDLE hMySharedMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF),
            NULL,PAGE_READWRITE,0,0x1000,"MySharedMem");
            并映射緩存區(qū)視圖:
            LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile,
            FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

            其他進(jìn)程訪問共享對(duì)象,需要獲得對(duì)象名并調(diào)用OpenFileMapping函數(shù)。
            HANDLE hMySharedMapFile=OpenFileMapping(FILE_MAP_WRITE,
            FALSE,"MySharedMem");

            一旦其他進(jìn)程獲得映射對(duì)象的句柄,可以象創(chuàng)建進(jìn)程那樣調(diào)用MapViewOfFile函數(shù)來(lái)映射對(duì)象視圖。用戶可以使用該對(duì)象視圖來(lái)進(jìn)行數(shù)據(jù)讀寫操作,以達(dá)到數(shù)據(jù)通訊的目的。

            當(dāng)用戶進(jìn)程結(jié)束使用共享內(nèi)存后,調(diào)用UnmapViewOfFile函數(shù)以取消其地址空間內(nèi)的視圖:
            if (!UnmapViewOfFile(pszMySharedMapView))
            {

                     AfxMessageBox("could not unmap view of file");

             }

            //=================================================================================
            //                  CreateFileMapping的MSDN翻譯和使用心得
            //=================================================================================
            測(cè)試創(chuàng)建和打開文件映射的時(shí)候老是得到"句柄無(wú)效"的錯(cuò)誤, 仔細(xì)看了MSDN以后才發(fā)覺是函數(shù)認(rèn)識(shí)不透, 這里把相關(guān)的解釋翻譯出來(lái)

            HANDLE CreateFileMapping(
              HANDLE hFile,                       //物理文件句柄
              LPSECURITY_ATTRIBUTES lpAttributes, //安全設(shè)置
              DWORD flProtect,                    //保護(hù)設(shè)置
              DWORD dwMaximumSizeHigh,            //高位文件大小
              DWORD dwMaximumSizeLow,             //低位文件大小
              LPCTSTR lpName                      //共享內(nèi)存名稱
            );

            1) 物理文件句柄
               任何可以獲得的物理文件句柄, 如果你需要?jiǎng)?chuàng)建一個(gè)物理文件無(wú)關(guān)的內(nèi)存映射也無(wú)妨, 將它設(shè)置成為 0xFFFFFFFF(INVALID_HANDLE_VALUE)就可以了.

               如果需要和物理文件關(guān)聯(lián), 要確保你的物理文件創(chuàng)建的時(shí)候的訪問模式和"保護(hù)設(shè)置"匹配, 比如: 物理文件只讀, 內(nèi)存映射需要讀寫就會(huì)發(fā)生錯(cuò)誤. 推薦你的物理文件使用獨(dú)占方式創(chuàng)建.

               如果使用 INVALID_HANDLE_VALUE, 也需要設(shè)置需要申請(qǐng)的內(nèi)存空間的大小, 無(wú)論物理文件句柄參數(shù)是否有效, 這樣 CreateFileMapping 就可以創(chuàng)建一個(gè)和物理文件大小無(wú)關(guān)的內(nèi)存空間給你, 甚至超過實(shí)際文件大小, 如果你的物理文件有效, 而大小參數(shù)為0, 則返回給你的是一個(gè)和物理文件大小一樣的內(nèi)存空間地址范圍.  返回給你的文件映射地址空間是可以通過復(fù)制, 集成或者命名得到, 初始內(nèi)容為0.

            2) 保護(hù)設(shè)置
               就是安全設(shè)置, 不過一般設(shè)置NULL就可以了, 使用默認(rèn)的安全配置. 在win2k下如果需要進(jìn)行限制, 這是針對(duì)那些將內(nèi)存文件映射共享給整個(gè)網(wǎng)絡(luò)上面的應(yīng)用進(jìn)程使用是, 可以考慮進(jìn)行限制.

            3) 高位文件大小
               弟兄們, 我想目前我們的機(jī)器都是32位的東東, 不可能得到超過32位進(jìn)程所能尋址的私有32位地址空間, 一般還是設(shè)置0吧, 我沒有也不想嘗試將它設(shè)置超過0的情況.
            4) 低位文件大小
               這個(gè)還是可以進(jìn)行設(shè)置的, 不過為了讓其他共享用戶知道你申請(qǐng)的文件映射的相關(guān)信息, 我使用的時(shí)候是在獲得的地址空間頭部添加一個(gè)結(jié)構(gòu)化描述信息, 記錄內(nèi)存映射的大小, 名稱等, 這樣實(shí)際申請(qǐng)的空間就比輸入的增加了一個(gè)頭信息結(jié)構(gòu)大小了, 我認(rèn)為這樣類似BSTR的方式應(yīng)該是比較合理的.

            5) 共享內(nèi)存名稱
               這個(gè)就是我今天測(cè)試的時(shí)候碰壁的禍根, 因?yàn)闉榱藢?duì)于內(nèi)存進(jìn)行互斥訪問, 我設(shè)置了一個(gè)互斥句柄, 而名稱我選擇和命名共享內(nèi)存同名, 之下就是因?yàn)樗麄兪褂霉餐膎amespace導(dǎo)致了錯(cuò)誤, 呵呵.

            7) 調(diào)用CreateFileMapping的時(shí)候GetLastError的對(duì)應(yīng)錯(cuò)誤
               ERROR_FILE_INVALID     如果企圖創(chuàng)建一個(gè)零長(zhǎng)度的文件映射, 應(yīng)有此報(bào)
               ERROR_INVALID_HANDLE   如果發(fā)現(xiàn)你的命名內(nèi)存空間和現(xiàn)有的內(nèi)存映射, 互斥量, 信號(hào)量, 臨界區(qū)同名就麻煩了
               ERROR_ALREADY_EXISTS   表示內(nèi)存空間命名已經(jīng)存在

            8) 相關(guān)服務(wù)或者平臺(tái)的命名保留
               Terminal Services:
               命名可以包含 "Global" 或者 "Local" 前綴在全局或者會(huì)話名空間初級(jí)文件映射. 其他部分可以包含任何除了()以外的字符, 可以參考 Kernel Object Name Spaces.

               Windows 2000 or later:
               如果 Terminal Services 沒有運(yùn)行 "Global" 和 "Local" 前綴的特殊含義就被忽略了

            posted on 2008-09-11 09:39 wrh 閱讀(1626) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            <2008年9月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            統(tǒng)計(jì)

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久免费精品re6| 伊人久久大香线蕉av不卡| 久久99精品国产99久久| 色综合久久综精品| 一本大道加勒比久久综合| 国产伊人久久| 久久精品无码一区二区WWW| 精品无码久久久久久尤物| 久久99精品国产99久久6| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 亚洲狠狠婷婷综合久久蜜芽| 久久久久久久人妻无码中文字幕爆 | 国产精品久久自在自线观看| 久久夜色撩人精品国产小说| 精品久久亚洲中文无码| 色综合久久最新中文字幕| 久久久久亚洲AV成人网人人网站| 999久久久免费国产精品播放| 婷婷久久精品国产| 国产国产成人精品久久| 伊人久久无码精品中文字幕| 欧美一区二区精品久久| 久久久无码精品亚洲日韩蜜臀浪潮| 久久男人AV资源网站| 久久婷婷久久一区二区三区| 99久久做夜夜爱天天做精品| 欧美久久一区二区三区| 亚洲综合精品香蕉久久网97 | 久久无码国产| 精品久久久久久无码中文字幕| 国产人久久人人人人爽| 久久精品国产2020| 综合人妻久久一区二区精品| 欧美一级久久久久久久大| 久久精品国产黑森林| 97久久精品人人做人人爽| 999久久久国产精品| 国产一区二区精品久久岳| yellow中文字幕久久网| 国产精品va久久久久久久| 99久久99久久精品国产片|