使用VARIANT傳遞陣列的方法及步驟

2021-05-22 14:49:42 字數 2663 閱讀 4198

在使用com/dcom寫元件時經常要傳遞陣列,一般比如short,long等指標可以直接傳遞相應的指標,但是當遇到需要傳遞byte陣列就有問題了,com不支援byte型別引數,傳遞byte陣列也就無從說起了。經過查詢資料發現使用variant變數可以傳遞任何型別的陣列,隨將使用variant陣列的方法總結一下。其實在variant傳遞陣列的方法非常簡單,只要理解safearray陣列的使用方法即可,實質上safearray就是將通常的陣列增加乙個描述符,說明其維數、長度、邊界、元素型別等資訊。safearray使用步驟如下:

步驟一:生成safearray陣列

variant varchunk;

safearray *psa; //使用陣列整理讀取的資料

safearraybound rgsabound[1];

rgsabound[0].celements =len; //設定陣列的大小

rgsabound[0].llbound = 0;

psa = safearraycreate(vt_ui1,1,rgsabound); //建立safearray陣列

步驟二:給safearray賦值與讀取

給safearray賦值或讀取有兩種方法,一種是直接讀取資料緩衝區,一種是通過函式乙個乙個讀取陣列每個變數值,很顯然前一種方法比後一種方法的效率要高很多,下面就兩種方法分別給出相應**

(1) 直接讀取緩衝區

讀取byte *buf;

safearrayaccessdata(psa, (void **)&buf); //安全指標

safearrayunaccessdata(psa); //關閉後仍然可讀取資料,但不能寫入

寫入byte *buf;

safearrayaccessdata(psa, (void **)&buf); //安全指標

for(int i=0;i

safearrayunaccessdata(psa);

(2) 利用函式單個讀取(safearraygetelement,safearrayputelement)

讀取long len=psa->rgsabound[0].celements;

byte *pdata=new byte[len];

for (int i=0;i

::safearraygetelement(psa,&i,pdata+i)

寫入long len=psa->rgsabound[0].celements;

for (int i=0;i

::safearrayputelement(psa,&i,pdata[i])

步驟三:將安全陣列與variant相互賦值

將安全陣列賦值給variant

variant varchunk;

varchunk.vt = vt_array|vt_ui1; //陣列型別

varchunk.parray = psa;

將variant賦值給安全陣列

safearray *psa=varchuank.parray;

通過以上三步就能夠很容易地在陣列和variant變數之間傳遞資料,另外variant還可以表示其他很多態別的資料,現將variant支援的資料型別列出:

unsigned char bval;  vt_ui1

short ival;       vt_i2

long lval; vt_i4

float fltval; vt_r4

double dblval; vt_r8

variant_bool boolval; vt_bool

scode scode; vt_error

cy cyval; vt_cy

date date; vt_date

bstr bstrval; vt_bstr

iunknown far* punkval; vt_unknown

idispatch far* pdispval; vt_dispatch

safearray far* parray; vt_array|*

unsigned char far* pbval; vt_byref|vt_ui1

short far* pival; vt_byref|vt_i2

long far* plval; vt_byref|vt_i4

float far* pfltval; vt_byref|vt_r4

double far* pdblval; vt_byref|vt_r8

variant_bool far* pboolval; vt_byref|vt_bool

scode far* pscode; vt_byref|vt_error

cy far* pcyval; vt_byref|vt_cy

date far* pdate; vt_byref|vt_date

bstr far* pbstrval; vt_byref|vt_bstr

iunknown far* far* ppunkval; vt_byref|vt_unknown

idispatch far* far* ppdispval; vt_byref|vt_dispatch

safearray far* far* pparray; vt_array|*

variant far* pvarval; vt_byref|vt_variant

void far* byref; vt_byref

C 使用VARIANT實現二維陣列的操作

variant變數是com元件之間互相通訊的重要的引數變數之一,它可以容納多種不同的型別,如short long double等,包括各類指標和陣列。元件之間的互相呼叫是比較耗時的,尤其帶噹元件位於不同程序中時,因此,減少傳遞次數是提高效率的一種有效方法。其中,excel 的操作就可能涉及到大量資料...

Delphi中的變體Variant陣列相關函式

1.vararraycreate procedure tform1.button1click sender tobject varv,w variant i integer begin v vararraycreate 1,4 varvariant v 1 1 v 2 2 v 3 true v 4 ...

使用陣列作為引數傳遞

如果乙個函式以一維陣列為引數,我們可以這樣宣告這個函式 void func int a void func int a void func int a 3 實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第乙個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三...