使用SAFEARRAY傳送物件(入門)

2021-05-24 11:52:16 字數 2556 閱讀 9601

使用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就是將通常的陣列增加乙個描述符,說明其維數 長度 邊界 元素型別等資...