Delphi如何宣告PSafeArray型態的參數 |
尚未結案
|
sally
一般會員 發表:10 回覆:21 積分:6 註冊:2003-08-08 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
sally
一般會員 發表:10 回覆:21 積分:6 註冊:2003-08-08 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言: 請教各位先進:Delphi呼叫VB的ocx,其中一個方法含有型態為PSafeArray的參數(var buf:PSafeArray),請問在Delphi中該如何宣告?謝謝不吝賜教!1. PsafeArray是一個Record的pointer, 宣告在Activex.pas中,如下 PSafeArray = ^TSafeArray; {$EXTERNALSYM tagSAFEARRAY} tagSAFEARRAY = record cDims: Word; fFeatures: Word; cbElements: Longint; cLocks: Longint; pvData: Pointer; rgsabound: array[0..0] of TSafeArrayBound; end; TSafeArray = tagSAFEARRAY;2. 在delphi中你可以用Variant來處理其Data 例如以下是寫入WebBrowse之片段程式 var v:Variant; ws:WideString; begin v := VarArrayCreate([0,0],varVariant); //create成variant array ws:=PageProducer1.Content; v[0] := ws; HTMLDocument := WebBrowser1.Document as IHTMLDocument2; HTML(pSafearray(TVarData(v).VArray)); ... end; |
sally
一般會員 發表:10 回覆:21 積分:6 註冊:2003-08-08 發送簡訊給我 |
歹勢,我的問題似乎不夠明確,容我再繼續說明:ocx中有一方法SendByte,包含二個參數(var id:WideString; var buf:PSafeArray),現在要將由鍵盤輸入的id及data分別傳入SendByte的id及buf,而data是binary type,一般寫入資料庫時以"0x"開頭即可表示二進制資料,但透過ocx方法該如何轉換,SendByte才能接受?曾出現的錯誤訊息如右->Types of actual and formal var parameters must be identical;麻煩各位了,謝謝!
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
那不是很清楚嗎, 你可以
宣告一個TSafeArray,填入此Record 之各field, 然後將其pointer傳入
或用SafeArrayCreate 之API 不習慣這些API的話, 由於Delphi的Varaint有一型態VT_ARRAY即是pSafeArray,故可以可以Create Vararray再轉型為所要的
v := VarArrayCreate([0,0],varVariant); //create成variant array
v[0] := data; //assing data
SendByte(xx, pSafearray(TVarData(v).VArray))
|
sally
一般會員 發表:10 回覆:21 積分:6 註冊:2003-08-08 發送簡訊給我 |
Hi,ccchen: Delphi我不是很熟,撰寫上述程式碼之前是否須做什麼動作嗎?根據您的範例套在我的程式碼裡,編譯後出現如右錯誤訊息Undeclared identifier: 'PSafeArray';以下是SendByte部份完整程式碼
procedure TForm1.buSendClick(Sender: TObject);
var Lws_Id : WideString;
Ls_Data : Variant;
begin
Lws_Id := edSend_Id.text;
Ls_Data := VarArrayCreate([0,0],varVariant); //create成variant array
Ls_Data[0] := edSend_Data.Text; //assing data
TcpClient1.SendByte(Lws_Id, PSafeArray(TVarData(Ls_Data).VArray));
end;
其中TcpClient1為物件名稱,謝謝!!
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
sally
一般會員 發表:10 回覆:21 積分:6 註冊:2003-08-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |