使用safearray
我們將使用safearray來通過com傳送序列化的物件。這部分將介紹如何建立和使用safearray型別。
safearray是資料結構的一種。這種結構也沒有什麼特別的,你只需要正確地設定它,當然你要知道其中一些頗為複雜的規定。為了確保safearray被正確地使用,它有一系列用作管理的api函式。這些api的函式負責建立、調整大小和刪除safearray。不幸的是,有關這些api函式的文件是相當少的。
對於safearray的內部結構我們並不關心,但了解一下是值得的。以下就是safearray的win32定義:
typedef struct tagsafearray
safearray;
這個結構的成員(cdims,clocks等)是通過api函式來設定和管理的。真正的資料存放在pvdata成員中,而safearraybound結構定義該陣列結構的細節。以下就是該結構成員的簡要描述:
成員描述
cdims
陣列的維數
ffeatures
用來描述陣列如何分配和如何被釋放的標誌
cbelements
陣列元素的大小
clocks
乙個計數器,用來跟蹤該陣列被鎖定的次數
pvdata
指向資料緩衝的指標
rgsabound
描述陣列每維的陣列結構,該陣列的大小是可變的
rgsabound是乙個有趣的成員,它的結構不太直觀。它是資料範圍的陣列。該陣列的大小依safe array維數的不同而有所區別。rgsabound成員是乙個safearraybound結構的陣列--每個元素代表safearray的乙個維。
typedef struct tagsafearraybound
safearraybound;
維數被定義在cdims成員中。例如,乙個'c'類陣列的維數可以是[3][4][5]-乙個三維的陣列。如果我們使用乙個safearray來表示這個結構,我們定義乙個有三個元素的rgsabound陣列--乙個代表一維。
cdims = 3;
...safearraybound rgsabound[ 3 ];
rgsabound[0]元素定義第一維。在這個例子中ilbound元素為0,是陣列的下界。celements成員的值等於三。陣列的第二維([4])可以被rgsabound結構的第二個元素定義。下界也可以是0,元素的個數是4,第三維也是這樣。要注意,由於這是乙個"c"陣列,因此由0開始,對於其它語言,例如visual basic,或者使用乙個不同的開始。該陣列的詳細情況如下所示:
元素celements
ilbound
rgsabound[0] 3 0
rgsabound[1]4 0
rgsabound[2]50
關於safearraybound結構其實還有很多沒說的。我們將要使用的safearray只是乙個簡單的單維位元組陣列。我們通過api函式建立陣列的時候,safearraybound將會被自動設定。只有在你需要使用複雜的多維陣列的時候,你才需要操作這個結構。
還有乙個名字為clocks的成員變數。很明顯,它與時間沒有任何的關係--它是乙個鎖的計數器。該引數是用來控制訪問陣列資料的。在你訪問它之前,你必須鎖定資料。通過跟蹤該計數器,系統可以在不需要該陣列時安全地刪除它。
建立safearray
建立乙個單維safearray的簡單方法是通過使用safearraycreatevector api函式。該函式可分配乙個特定大小的連續記憶體塊。
safearray *psa;
file://create a safe array to store the stream data
file://llen is the number of bytes in the array.
psa = safearraycreatevector( vt_ui1, 0, llen );
safearraycreatevector api建立乙個safearray,並且返回乙個指向它的指標。首個引數用來定義陣列的型別--它可以是任何有效的變數資料型別。為了傳送乙個序列化的物件,我們將使用最基本的型別--乙個非負的位元組陣列。vt--ui1代表非負整形的變數型別,1個位元組。
常數'0'定義陣列的下界;在c++中,通常為0。最後的引數llen定義陣列元素的個數。在我們的例子中,這與我們將要傳送物件的位元組數是一樣的。我們還沒有提陣列大小(llen)是怎樣來的,這將在我們重新考查序列化時提及。
在你訪問safearray資料之前,你必須呼叫safearrayaccessdata。該函式鎖定資料並且返回乙個指標。在這裡,鎖定陣列意味著增加該陣列的內部計數器(clocks)。
file://define a pointer to a byte array
unsigned char *pdata = null;
safearrayaccessdata( psa, (void**)&pdata );
... use the safe array
safearrayunaccessdata(psa);
相應用來釋放資料的函式是safearrayunaccessdata(),該功能釋放該引數的計數。
學會使用SafeArray
學會使用safearray也是很重要的,因為在ado程式設計中經常要用。它的主要目的是用於automation中的陣列型引數的傳遞。因為在網路環境中,陣列是不能直接傳遞的,而必須將其包裝成safearray。實質上safearray就是將通常的陣列增加乙個描述符,說明其維數 長度 邊界 元素型別等資...
學會使用SafeArray
學會使用safearray也是很重要的,因為在ado程式設計中經常要用。它的主要目的是用於automation中的陣列型引數的傳遞。因為在網路環境中,陣列是不能直接傳遞的,而必須將其包裝成safearray。實質上safearray就是將通常的陣列增加乙個描述符,說明其維數 長度 邊界 元素型別等資...
safearray 的具體使用方法
學會使用safearray也是很重要的,因為在ado程式設計中經常要用。它的主要目的是用於automation中的陣列型引數的傳遞。因為在網路環境中,陣列是不能直接傳遞的,而必須將其包裝成safearray。實質上safearray就是將通常的陣列增加乙個描述符,說明其維數 長度 邊界 元素型別等資...