青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

kenlistian

厚積薄發(fā). 勤為槳,思為帆

   :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
  73 隨筆 :: 4 文章 :: 22 評論 :: 0 Trackbacks

    猛料資料,首先介紹SafeArray使用,在介紹SafeArray中的結(jié)構(gòu)。看完該節(jié)文章,SafeArray的陌生感一掃而去。

    SafeArray 在ADO編程中經(jīng)常使用。它的主要目的是用于automation中的數(shù)組型參數(shù)的傳遞。因為在網(wǎng)絡(luò)環(huán)境中,數(shù)組是不能直接傳遞的,而必須將其包裝成 SafeArray。實質(zhì)上SafeArray就是將通常的數(shù)組增加一個描述符,說明其維數(shù)、長度、邊界、元素類型等信息。SafeArray也并不單獨使用,而是將其再包裝到VARIANT類型的變量中,然后才作為參數(shù)傳送出去。在VARIANT的vt成員的值如果包含VT_ARRAY|...,那么它所封裝的就是一個SafeArray,它的parray成員即是指向SafeArray的指針。SafeArray中元素的類型可以是VARIANT能封裝的任何類型,包括VARIANT類型本身。 

使用SafeArray的具體步驟:

方法一:

 包裝一個SafeArray:

(1)定義變量,如:

   VARIANT varChunk;

   SAFEARRAY *psa;

   SAFEARRAYBOUND rgsabound[1];

(2) 創(chuàng)建SafeArray描述符:

 //read array from a file.

 uIsRead=f.Read(bVal,ChunkSize);

 if(uIsRead==0)

break;

 rgsabound[0].cElements = uIsRead;

 rgsabound[0].lLbound = 0;

 psa = SafeArrayCreate(VT_UI1,1,rgsabound);

(3)放置數(shù)據(jù)元素到SafeArray:

 for(long index=0;index<uIsRead;index++)         

 {

    if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))

    ::MessageBox(NULL,"出毛病了。","提示",MB_OK | MB_ICONWARNING);

  }

 一個一個地放,挺麻煩的。

(4)封裝到VARIANT內(nèi):

   varChunk.vt = VT_ARRAY|VT_UI1;

   varChunk.parray = psa;

 這樣就可以將varChunk作為參數(shù)傳送出去了。

讀取SafeArray中的數(shù)據(jù)的步驟:

(1)用SafeArrayGetElement一個一個地讀

 BYTE buf[lIsRead];

 for(long index=0; index<lIsRead; index++)        

 {          

    ::SafeArrayGetElement(varChunk.parray,&index,buf+index);  

 }

 就讀到緩沖區(qū)buf里了。

方法二:

 使用SafeArrayAccessData直接讀寫SafeArray的緩沖區(qū):

(1)讀緩沖區(qū):

 BYTE *buf;

 SafeArrayAccessData(varChunk.parray, (void **)&buf);

 f.Write(buf,lIsRead);

 SafeArrayUnaccessData(varChunk.parray);

(2)寫緩沖區(qū):

 BYTE *buf;

 ::SafeArrayAccessData(psa, (void **)&buf);

 for(long index=0;index<uIsRead;index++)         

 {

     buf[index]=bVal[index]; 

 }

 ::SafeArrayUnaccessData(psa);

 varChunk.vt = VT_ARRAY|VT_UI1;

 varChunk.parray = psa;

   

    這種方法讀寫SafeArray都可以,它直接操縱SafeArray的數(shù)據(jù)緩沖區(qū),比用SafeArrayGetElement和 SafeArrayPutElement速度快。特別適合于讀取數(shù)據(jù)。但用完之后不要忘了調(diào)用::SafeArrayUnaccessData (psa),否則會出錯的。

以下就是SAFEARRAY的Win32定義:

  typedef struct tagSAFEARRAY

   {

    unsigned short cDims;

    unsigned short fFeatures;

    unsigned long cbElements;

    unsigned long cLocks;

    void * pvData;

    SAFEARRAYBOUND rgsabound[ 1 ];

   } SAFEARRAY;

  這個結(jié)構(gòu)的成員(cDims,cLocks等)是通過API函數(shù)來設(shè)置和管理的。真正的數(shù)據(jù)存放在pvData成員中,而SAFEARRAYBOUND結(jié)構(gòu)定義該數(shù)組結(jié)構(gòu)的細節(jié)。以下就是該結(jié)構(gòu)成員的簡要描述:

成員

描述

cDims

數(shù)組的維數(shù)

fFeatures

用來描述數(shù)組如何分配和如何被釋放的標志

cbElements

數(shù)組元素的大小

cLocks

一個計數(shù)器,用來跟蹤該數(shù)組被鎖定的次數(shù)

pvData 

指向數(shù)據(jù)緩沖的指針

rgsabound

描述數(shù)組每維的數(shù)組結(jié)構(gòu),該數(shù)組的大小是可變的

 rgsabound是一個有趣的成員,它的結(jié)構(gòu)不太直觀。它是數(shù)據(jù)范圍的數(shù)組。該數(shù)組的大小依safe array維數(shù)的不同而有所區(qū)別。rgsabound成員是一個SAFEARRAYBOUND結(jié)構(gòu)的數(shù)組--每個元素代表SAFEARRAY的一個維。

  typedef struct tagSAFEARRAYBOUND

   {

    unsigned long cElements;

    unsigned long lLbound;

   } SAFEARRAYBOUND;

  維數(shù)被定義在cDims成員中。例如,一個\'C\'類數(shù)組的維數(shù)可以是[3][4][5]-一個三維的數(shù)組。如果我們使用一個SAFEARRAY來表示這個結(jié)構(gòu),我們定義一個有三個元素的rgsabound數(shù)組--一個代表一維。

  cDims = 3;

    ...

  SAFEARRAYBOUND rgsabound[3];

  rgsabound[0]元素定義第一維。在這個例子中ILBOUND元素為0,是數(shù)組的下界。cElements成員的值等于三。數(shù)組的第二維 ([4])可以被rgsabound結(jié)構(gòu)的第二個元素定義。下界也可以是0,元素的個數(shù)是4,第三維也是這樣。

   要注意,由于這是一個"C"數(shù)組,因此由0 開始,對于其它語言,例如Visual Basic,或者使用一個不同的開始。該數(shù)組的詳細情況如下所示:

元素

cElements

ILbound

rgsabound[0] 

0

rgsabound[1]

0

rgsabound[2]

5

0

   關(guān)于SAFEARRAYBOUND結(jié)構(gòu)其實還有很多沒說的。我們將要使用的SAFEARRAY只是一個簡單的單維字節(jié)數(shù)組。我們通過API函數(shù)創(chuàng)建數(shù)組的時候,SAFEARRAYBOUND將會被自動設(shè)置。只有在你需要使用復(fù)雜的多維數(shù)組的時候,你才需要操作這個結(jié)構(gòu)。

  還有一個名字為cLocks的成員變量。很明顯,它與時間沒有任何的關(guān)系--它是一個鎖的計數(shù)器。該參數(shù)是用來控制訪問數(shù)組數(shù)據(jù)的。在你訪問它之前,你必須鎖定數(shù)據(jù)。通過跟蹤該計數(shù)器,系統(tǒng)可以在不需要該數(shù)組時安全地刪除它。 

創(chuàng)建SAFEARRAY

  創(chuàng)建一個單維SAFEARRAY的簡單方法是通過使用SafeArrayCreateVector API函數(shù)。該函數(shù)可分配一個特定大小的連續(xù)內(nèi)存塊。

  SAFEARRAY *psa;

  //  create a safe array to store the stream data

  //  llen is the number of bytes in the array.

  psa = SafeArrayCreateVector( VT_UI1, 0, llen );

   SafeArrayCreateVector API創(chuàng)建一個SAFEARRAY,并且返回一個指向它的指針。首個參數(shù)用來定義數(shù)組的類型--它可以是任何有效的變量數(shù)據(jù)類型。為了傳送一個串行化的對 象,我們將使用最基本的類型--一個非負的字節(jié)數(shù)組。VT--UI1代表非負整形的變量類型,1個字節(jié)。

  常數(shù)\'0\'定義數(shù)組的下界;在C++中,通常為0。最后的參數(shù)llen定義數(shù)組元素的個數(shù)。在我們的例子中,這與我們將要傳送對象的字節(jié)數(shù)是一樣的。我們還沒有提數(shù)組大小(llen)是怎樣來的,這將在我們重新考查串行化時提及。

  在你訪問SAFEARRAY數(shù)據(jù)之前,你必須調(diào)用SafeArrayAccessData。該函數(shù)鎖定數(shù)據(jù)并且返回一個指針。在這里,鎖定數(shù)組意味著增加該數(shù)組的內(nèi)部計數(shù)器(cLocks)。

  //  define a pointer to a byte array

  unsigned char *pData = NULL;

  SafeArrayAccessData( psa, (void**)&pData );

   ... use the safe array

  SafeArrayUnaccessData(psa);

  相應(yīng)用來釋放數(shù)據(jù)的函數(shù)是SafeArrayUnaccessData(),該功能釋放該參數(shù)的計數(shù)。



Powered by ScribeFire.

posted on 2008-02-13 16:08 kenlistian 閱讀(17705) 評論(0)  編輯 收藏 引用

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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品美女在线| 日韩小视频在线观看专区| 欧美日一区二区三区在线观看国产免 | 亚洲在线一区| 欧美国产视频在线| 免费成人高清| 国产一区二区日韩| 午夜视频在线观看一区| 亚洲一区国产精品| 欧美日韩三级电影在线| 亚洲国产精品99久久久久久久久| 国产主播一区| 午夜视频久久久| 久久成人一区二区| 国产情人节一区| 欧美一区二区福利在线| 久久狠狠亚洲综合| 国产午夜精品全部视频在线播放 | 99国产精品自拍| 麻豆av福利av久久av| 蜜臀av一级做a爰片久久| 韩日欧美一区二区| 久久综合伊人77777麻豆| 女主播福利一区| 亚洲人屁股眼子交8| 欧美精品精品一区| 日韩午夜精品| 欧美一区二区三区久久精品| 国产日韩欧美日韩| 久久精品视频在线观看| 欧美高清hd18日本| 日韩一级不卡| 欧美午夜国产| 性欧美大战久久久久久久免费观看| 欧美一区亚洲二区| 狠狠狠色丁香婷婷综合激情| 久久天堂av综合合色| 亚洲国产成人在线| 亚洲资源av| 国产主播精品在线| 男人插女人欧美| 99国产精品视频免费观看| 午夜国产精品视频免费体验区| 国产午夜久久| 久久综合伊人77777蜜臀| 亚洲人成在线免费观看| 亚洲欧美日韩综合一区| 国内激情久久| 欧美国产在线观看| 亚洲午夜电影在线观看| 久久婷婷一区| 中日韩午夜理伦电影免费| 国产亚洲精品久久久久久| 老司机午夜精品| 亚洲图片你懂的| 免费在线观看一区二区| 一区二区三区视频在线播放| 国产午夜精品一区二区三区欧美 | 欧美一区二区三区在线观看| 麻豆精品视频| 亚洲欧美国产制服动漫| 禁断一区二区三区在线| 欧美日韩一区在线观看视频| 欧美一区二区三区在线观看| 亚洲精品国产精品乱码不99按摩| 欧美影院在线播放| 日韩系列在线| 在线观看91精品国产入口| 欧美视频日韩视频| 久久人91精品久久久久久不卡 | 亚洲日韩中文字幕在线播放| 欧美中文字幕不卡| 99成人在线| **性色生活片久久毛片| 国产精品一区二区黑丝| 欧美日韩激情网| 裸体一区二区| 久久国产福利| 亚洲一区二区在线免费观看视频| 亚洲国产欧美一区二区三区同亚洲| 欧美综合77777色婷婷| 亚洲一级特黄| 99国产精品一区| 亚洲国产欧美不卡在线观看| 国内综合精品午夜久久资源| 国产精品久久网站| 欧美日韩在线视频观看| 欧美精品v日韩精品v韩国精品v | 亚洲国产你懂的| 好看的av在线不卡观看| 国产精品视频网站| 国产精品久久久久久久久久久久久| 欧美高清视频在线播放| 久久亚洲精品一区二区| 久久久久久久一区| 久久久www成人免费精品| 欧美亚洲免费高清在线观看| 亚洲一区二区三区高清| 一区二区三欧美| 一区二区免费在线观看| 中日韩在线视频| 亚洲午夜国产成人av电影男同| 99在线|亚洲一区二区| 日韩视频免费观看| 一本色道久久综合亚洲精品高清| 91久久中文字幕| 亚洲日本aⅴ片在线观看香蕉| 亚洲国产精品久久久| 亚洲人成久久| 亚洲美女黄色| 亚洲一区二区免费在线| 亚洲欧美在线另类| 欧美一区二区三区在线观看视频 | 一区二区三区在线免费播放| 永久91嫩草亚洲精品人人| 亚洲成人影音| 99re亚洲国产精品| 亚洲欧美春色| 欧美在线亚洲在线| 欧美96在线丨欧| 亚洲国内欧美| 中文精品视频一区二区在线观看| 亚洲一区在线播放| 久久都是精品| 欧美激情在线狂野欧美精品| 欧美视频一区二区三区四区| 国产免费亚洲高清| 国内久久精品| 野花国产精品入口| 欧美一级一区| 欧美高清hd18日本| 一区二区高清视频在线观看| 午夜日韩在线| 欧美肥婆bbw| 国产欧美一区二区精品性色| 亚洲高清久久久| 亚洲一区免费视频| 蜜桃久久av一区| 亚洲免费观看高清在线观看 | 久久影院午夜片一区| 欧美激情综合五月色丁香| 国产精品午夜久久| 亚洲日本一区二区| 欧美一区深夜视频| 亚洲国产乱码最新视频| 午夜久久久久久| 欧美激情视频一区二区三区在线播放| 国产精品女人久久久久久| 亚洲国产精品日韩| 香蕉av福利精品导航| 亚洲第一在线综合网站| 亚洲欧美制服另类日韩| 欧美激情精品| 永久91嫩草亚洲精品人人| 亚洲一区国产视频| 亚洲国产国产亚洲一二三| 午夜精品久久久久久久蜜桃app| 欧美成人性网| 国内外成人免费激情在线视频 | 久久久91精品国产| 日韩视频永久免费| 免费成人激情视频| 国内精品久久久久久久果冻传媒| 9l视频自拍蝌蚪9l视频成人| 久久男女视频| 亚洲综合精品自拍| 欧美日韩在线播放三区| 亚洲日本久久| 欧美电影打屁股sp| 欧美在线免费播放| 国产欧美韩国高清| 亚洲欧美美女| a91a精品视频在线观看| 欧美精品入口| 亚洲精品自在久久| 欧美激情欧美狂野欧美精品 | 牛夜精品久久久久久久99黑人| 国产视频一区在线观看一区免费| 一区二区三区产品免费精品久久75| 欧美福利在线| 美女亚洲精品| 91久久精品国产91久久性色| 免费不卡视频| 另类尿喷潮videofree| 伊人久久大香线蕉综合热线 | 亚洲第一网站| 欧美插天视频在线播放| 亚洲国产精品日韩| 欧美成人资源网| 欧美91视频| 日韩视频在线免费观看| 亚洲人成在线播放网站岛国| 欧美精品一区二区三区蜜桃| 亚洲精品久久久久久下一站| 最近中文字幕日韩精品 | 欧美精品在线视频观看| 日韩午夜精品视频| 亚洲精品一区二区三区福利| 欧美视频1区| 欧美在线不卡|