如何获取PSafeArray中的数据? |
答題得分者是:jow
|
hnlg81004
一般會員 發表:5 回覆:7 積分:2 註冊:2005-02-16 發送簡訊給我 |
这是接口代码:
ILogicAPI = interface(IDispatch) ['{721C0697-937E-3595-8EB9-E7128FA55FF4}'] function GetECSpecNames: PSafeArray; safecall; 这是调用接口的代码: procedure TForm1.Button1Click(Sender: TObject); var iapi: ILogicAPI; arr: PSafeArray; pt: Pointer; begin iapi := CreateComObject(CLASS_LogicAPI_) as ILogicAPI; arr := iapi.GetECSpecNames; SafeArrayAccessData(arr,pt); showmessage(TStringArray(pt)[0]); SafeArrayUnAccessData(arr); end; 调用接口函数返回的字符串应该是TEST,现在可以返回一个T,后面三个怎么 返回呢?请教。 |
hnlg81004
一般會員 發表:5 回覆:7 積分:2 註冊:2005-02-16 發送簡訊給我 |
|
hnlg81004
一般會員 發表:5 回覆:7 積分:2 註冊:2005-02-16 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
什麼是Data Marshal??
以 interface 為基礎的COM/DCOM物件, 其實是一種資料 傳輸的協定, 所以資料如何在傳輸的兩個端點被辨識其內容? 資料透過適當的編排, 然後傳到另一端之後再被解開來,這個 資料編排的動作就是 Data Marshal了. 依你的提問來看, 傳回的資料應該是一個 WideString Array, 你可以試 著轉型看看... 以下分享一個Data Marshal的例子: 傳送端: [code delphi] function StreamToVariant(S: TMemoryStream): OleVariant; var P: Pointer; begin if S = nil then Result := NULL else begin Result := VarArrayCreate([0,S.Size-1],varByte); P := VarArrayLock(Result); try Move(S.Memory^,P^,S.Size); finally VarArrayUnlock(Result); end; end; end; [/code] 接收端: [code delphi] function VariantToStream(V: OleVariant): TMemoryStream; var SZ: Integer; P: Pointer; begin //Free returned TMemoryStream in Calling Rountine if V = NULL then Result := nil else begin Result := TMemoryStream.Create; try SZ := VarArrayHighBound(V,1) 1; P := VarArrayLock(V); try Result.Write(P^,SZ); Result.Position := 0; finally VarArrayUnlock(V); end; except FreeAndNil(Result); end; end; end; [/code] 個人見解, 僅供參考......
編輯記錄
jow 重新編輯於 2008-03-14 11:01:51, 註解 無‧
|
hnlg81004
一般會員 發表:5 回覆:7 積分:2 註冊:2005-02-16 發送簡訊給我 |
|
hnlg81004
一般會員 發表:5 回覆:7 積分:2 註冊:2005-02-16 發送簡訊給我 |
谢谢Jow大侠,我终于知道了。搞定,耶。
我把代码发出来分享一下 接口代码: ILogicAPI = interface(IDispatch) ['{721C0697-937E-3595-8EB9-E7128FA55FF4}'] function GetECSpecNames: PSafeArray; safecall; 调用端代码 声明一个WideString的数组(开始我就声明的是String数组了,导致TStringArray(pt)[0]只取了一个字符串) TWideStringArray =Array of WideString; procedure TForm1.Button1Click(Sender: TObject); var iapi: ILogicAPI; arr: PSafeArray; pt: Pointer; specName: WideString; begin iapi := CreateComObject(CLASS_LogicAPI_) as ILogicAPI; arr := iapi.GetECSpecNames; SafeArrayAccessData(arr,pt); specName := TWideStringArray(pt)[0]; memo1.Lines.add('ECSpecNames is : ' specName); SafeArrayUnAccessData(arr); |
hnlg81004
一般會員 發表:5 回覆:7 積分:2 註冊:2005-02-16 發送簡訊給我 |
最后又完善了一下,这是完善后的代码:
[code delphi] procedure TForm1.Button1Click(Sender: TObject); var iapi: ILogicAPI; arr: PSafeArray; pt: Pointer; specName: WideString; hr: HRESULT; i,ILbound,IUbound,cElements: integer; begin iapi := CreateComObject(CLASS_LogicAPI_) as ILogicAPI; arr := iapi.GetECSpecNames; hr := SafeArrayAccessData(arr,pt); if FAILED(hr) then memo1.Lines.Add('Access SafeArrayData ocured error!') else begin SafeArrayGetLBound(arr,arr.cDims,ILbound); SafeArrayGetUBound(arr,arr.cDims,IUbound); cElements :=IUbound-ILbound 1; for i:=0 to cElements-1 do begin specName := TWideStringArray(pt)[i]; memo1.Lines.add('ECSpecNames is : ' specName); end; end; SafeArrayUnAccessData(arr); end; [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |