电竞比分网-中国电竞赛事及体育赛事平台

分享

C++使用VARIANT傳遞數(shù)組的方法

 好景宜人 2015-08-01
轉(zhuǎn)自:http://blog./a/17649.htm                  
在使用COM/DCOM寫組件時經(jīng)常要傳遞數(shù)組,一般比如SHORT,LONG等指針可以直接傳遞相應(yīng)的指針,但是當(dāng)遇到需要傳遞BYTE數(shù)組就有問題了,COM不支持BYTE類型參數(shù),傳遞BYTE數(shù)組也就無從說起了。其實(shí)VARIANT變量可以傳遞任何類型的數(shù)組,下面將使用VARIANT數(shù)組的方法總結(jié)一下。其實(shí)在VARIANT傳遞數(shù)組的方法非常簡單,只要理解SAFEARRAY數(shù)組的使用方法即可,實(shí)質(zhì)上SafeArray就是將通常的數(shù)組增加一個描述符,說明其維數(shù)、長度、邊界、元素類型等信息。SafeArray使用步驟如下:[喝小酒的網(wǎng)摘]http://blog./a/17649.htm

步驟一:生成SafeArray數(shù)組

VARIANT varChunk;

SAFEARRAY *psa; //使用數(shù)組整理讀取的數(shù)據(jù)

SAFEARRAYBOUND rgsabound[1];

rgsabound[0].cElements =len; //設(shè)置數(shù)組的大小

rgsabound[0].lLbound = 0;

psa = SafeArrayCreate(VT_UI1,1,rgsabound); //創(chuàng)建SafeArray數(shù)組

步驟二:給SafeArray賦值與讀取

給SafeArray賦值或讀取有兩種方法,一種是直接讀取數(shù)據(jù)緩沖區(qū),一種是通過函數(shù)一個一個讀取數(shù)組每個變量值,很顯然前一種方法比后一種方法的效率要高很多,下面就兩種方法分別給出相應(yīng)代碼

(1) 直接讀取緩沖區(qū)

讀取

BYTE *buf;

SafeArrayAccessData(psa, (void **)&buf); //安全指針
//直接接作buf即可
SafeArrayUnaccessData(psa); //關(guān)閉后仍然可讀取數(shù)據(jù),但不能寫入

寫入

BYTE *buf;

SafeArrayAccessData(psa, (void **)&buf); //安全指針
//直接接作buf即可
SafeArrayUnaccessData(psa);

(2) 利用函數(shù)單個讀取(SafeArrayGetElement,SafeArrayPutElement)

讀取

long len=psa->rgsabound[0].cElements;

BYTE *pData=new BYTE[len];

for (int i=0;i<len;i++)

{

::SafeArrayGetElement(psa,&i,pData+i)

}

寫入

long len=psa->rgsabound[0].cElements;

for (int i=0;i<len;i++)

{

::SafeArrayPutElement(psa,&i,pData[i])

}

步驟三:將安全數(shù)組與VARIANT相互賦值

將安全數(shù)組賦值給VARIANT

VARIANT varChunk;

varChunk.vt = VT_ARRAY|VT_UI1; //數(shù)組類型

varChunk.parray = psa;

將VARIANT賦值給安全數(shù)組

SAFEARRAY *psa=varChuank.parray;

最后,一定要記得釋放數(shù)組,否則會有內(nèi)存泄漏。

SafeArrayDestroy(psa);[喝小酒的網(wǎng)摘]http://blog./a/17649.htm

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多