全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3240
推到 Plurk!
推到 Facebook!

如何获取PSafeArray中的数据?

答題得分者是:jow
hnlg81004
一般會員


發表:5
回覆:7
積分:2
註冊:2005-02-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-13 15:49:37 IP:59.37.xxx.xxx 訂閱
这是接口代码:
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-13 22:09:31 IP:220.242.xxx.xxx 訂閱
自己摸了一阵,瞎搞出来了结果,可是不知道所以然,期待高人指点.我是这样写的showmessage(TStringArray(pt)[0,1]+TStringArray(pt)[0,3]+TStringArray(pt)[0,5]+TStringArray(pt)[0,7]);
hnlg81004
一般會員


發表:5
回覆:7
積分:2
註冊:2005-02-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-14 09:03:56 IP:59.37.xxx.xxx 訂閱
没有人知道么?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-14 10:56:21 IP:210.66.xxx.xxx 訂閱
什麼是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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-14 13:28:07 IP:59.37.xxx.xxx 訂閱
多谢大家出手相救,我是在delphi端调用Java的WebServices,不知道是Delphi7对SOAP支持不够还是我不会用,反正直接导入wsdl调用返回的结果不对,而且都是XML格式的。我只好先在VS2005中用C#将Java的WebServices提供的API接口重新封装一次,再给Delphi调用。上面的那个结构函数确实返回的应该是WideString Array。你贴的代码我看不大明白啊,哪部分代码是我应该在Delphi端用到的呢?再次麻烦,本人愚钝
hnlg81004
一般會員


發表:5
回覆:7
積分:2
註冊:2005-02-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-03-14 13:49:46 IP:59.37.xxx.xxx 訂閱
谢谢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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-03-14 16:20:19 IP:59.37.xxx.xxx 訂閱
最后又完善了一下,这是完善后的代码:

[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]
系統時間:2024-05-16 11:51:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!