網上廣爲流傳的兩個函數,確實好用。記錄一下
procedure VariantToStream (const v : OleVariant; Stream : TMemoryStream);
var
p : pointer;
begin
Stream.Position := 0;
Stream.Size := VarArrayHighBound (v, 1) - VarArrayLowBound (v, 1) + 1; //其實可以直接取下維作爲流大小,因爲一般情況下變體數組上維爲0的
p := VarArrayLock (v); //我寫程序時,就是到此卡住了,因爲變體數組是一種安全數組,它是有描述數據的數組,v[0]纔是它的真實起始地址,但就是很難得到它的地址,而這個函數剛好處理了這個問題!
Stream.Write (p^, Stream.Size); //此句讓我這個初學者驚歎,也不是沒有這樣用過,只是沒有在數組中這樣結合用過,呵呵,學習學習!
VarArrayUnlock (v); //再使用了VarArratLock()函數以後,一定要用此函,不然會報錯的!
Stream.Position := 0;
end;
procedure StreamToVariant (Stream : TMemoryStream; var v : OleVariant);
var
p : pointer;
begin
v := VarArrayCreate ([0, Stream.Size - 1], varByte); //也學習一下這個函數,它是用來建立一個變體數組
p := VarArrayLock (v); //其它就沒有什麼了,基本跟上面的是相反的!
Stream.Position := 0;
Stream.Read (p^, Stream.Size); //其實這兩個過程的妙處就在此了,指針的應用,棒極了
VarArrayUnlock (v);
end;