SAFEARRAY

步驟編輯

SAFEARRAY的主要目的是用於automation中的數組型參數的傳遞。由於在網絡環境中,數組是不能直接傳遞的,而必須將其包裝成SafeArray。實質上SafeArray就是將一般的數組增長一個描述符,說明其維數、長度、邊界、元素類型等信息。SafeArray也並不單獨使用,而是將其再包裝到VARIANT類型的變量中,而後才做爲參數傳送出去。在VARIANT的vt成員的值若是包含VT_ARRAY|...,那麼它所封裝的就是一個SafeArray,它的parray成員便是指向SafeArray的指針。 SafeArray中元素的類型能夠是VARIANT能封裝的任何類型,包括VARIANT類型自己。數組

使用SafeArray的具體步驟:網絡

2方法一編輯

包裝一個SafeArrayspa

(1). 定義變量,如:指針

VARIANT varChunk;htm

SAFEARRAY *psa;get

SAFEARRAYBOUND rgsabound[1];it

(2). 建立SafeArray描述符:io

uIsRead=f.Read(bVal,ChunkSize);//read array from a file.變量

if(uIsRead==0)break;file

rgsabound[0].cElements =uIsRead;

rgsabound[0].lLbound = 0;

psa = SafeArrayCreate(VT_UI1,1,rgsabound);

(3). 放置數據元素到SafeArray:

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

{

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

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

}

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

(4). 封裝到VARIANT內:

varChunk.vt = VT_ARRAY|VT_UI1;

varChunk.parray = psa;

這樣就能夠將varChunk做爲參數傳送出去了。

讀取SafeArray中的數據的步驟:

(1). 用SafeArrayGetElement一個一個地讀

BYTE buf[lIsRead];

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

{

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

}

就讀到緩衝區buf裏了。

3方法二編輯

用SafeArrayAccessData直接讀寫SafeArray緩衝區:

(1). 讀緩衝區:

BYTE *buf;

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

f.Write(buf,lIsRead);

SafeArrayUnaccessData(varChunk.parray);

(2). 寫緩衝區:

BYTE *buf;

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

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

{

buf=bVal;

}

::SafeArrayUnaccessData(psa);

varChunk.vt = VT_ARRAY|VT_UI1;

varChunk.parray = psa;

這種方法讀寫SafeArray均可以,它直接操縱SafeArray的數據緩衝區,比用SafeArrayGetElement和 SafeArrayPutElement速度快。特別適合於讀取數據。但用完以後不要忘了調用::SafeArrayUnaccessData (psa),不然會出錯的。

若是SafeArray中存的是BSTR的二維數組,則代碼以下:

if(varChunk.vt = VT_ARRAY | VT_BSTR)

{

BSTR* buf;

long LBound; // 數組下界

long UBound; // 數組上界

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

SafeArrayGetLBound(varChunk.parray, 1, &LBound);

SafeArrayGetUBound(varChunk.parray, 1, &UBound);

for(long i = LBound; i < UBound; i ++)

{

CString str(buf);

MessageBox(str);

}

SafeArrayUnaccessData(varChunk.parray);

}

相關文章
相關標籤/搜索