在使用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 實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第乙個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三...