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

指針(Pointer)如何在DLL中使用與呼叫

尚未結案
chfamy
中階會員


發表:87
回覆:161
積分:54
註冊:2002-05-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-17 06:11:37 IP:61.219.xxx.xxx 未訂閱
拜讀前輩有關指針(Pointer)使用方式,URL如下列式: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57967 依舊無法理解如何在DLL中使用與呼叫該DLL中的function, 有就前輩指導使用方法使指正錯誤,謝謝. DLL部份程式碼: library MyDLL; uses SysUtils, Classes; function Get_DllData(pDllData1,pDllData2,pDllData3,pDllData4: PChar): PChar; type pPChar = ^PChar; var pPChar1: pPChar; pPChar2: pPChar; pPChar3: pPChar; pPChar4: pPChar; begin try pPChar1 := @pDllData1; pPChar2 := @pDllData2; pPChar3 := @pDllData3; pPChar4 := @pDllData4; pPChar1^ := PChar('11'); pPChar2^ := PChar('22'); pPChar3^ := PChar('33'); pPChar4^ := PChar('44'); Result := '0'; except Result := '1'; end; end; function MyDllFunction(iFunction: Integer;Lp1,Lp2,Lp3,Lp4: PChar): PChar; StdCall; begin case (iFunction) 1: Result := Get_DllData(Lp1,Lp2,Lp3,Lp4); 2: Result := Get_DllData(Lp2,Lp3,Lp4,Lp1); 3: Result := Get_DllData(Lp3,Lp4,Lp1,Lp2); 4: Result := Get_DllData(Lp4,Lp1,Lp2,Lp3); end; end; exports MyDllFunction name 'MyDllFunction'; begin end. 呼叫DLL-Function部份程式碼: function MyDllFunction(iFunction: Integer;Lp1,Lp2,Lp3,Lp4: PChar): PChar; StdCall; External 'MyDLL.dll'; procedure TForm1.Button1Click(Sender: TObject); var sData1: String; sData2: String; sData3: String; sData4: String; begin Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit4.Text := ''; sDefData1 := Edit1.Text; sDefData2 := Edit2.Text; sDefData3 := Edit3.Text; sDefData4 := Edit4.Text; MyDllFunction(1, @sData1, @sData2, @sData3, @sData4); Edit1.Text := sData1; Edit2.Text := sData2; Edit3.Text := sData3; Edit4.Text := sData4; end;
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-17 10:15:12 IP:220.130.xxx.xxx 未訂閱
chfamy 您好: 仔細推敲,您應該不是要問 pointer 的問題,在 dll 使用 Dll scope 的變數或 pointer 與一般寫法相同,只是若是要跨 Process 的全域變數,與此時操作的 pointer 便有所不同,需要小心... 呼叫/撰寫 dll 的方式,請參考天使站大的作品 : http://delphi.ktop.com.tw/topic.php?TOPIC_ID=18177 dll 呼叫的簡介與說明請參考,jackkcg Sir 的轉貼文章 : http://delphi.ktop.com.tw/topic.php?topic_id=22254 ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
chfamy
中階會員


發表:87
回覆:161
積分:54
註冊:2002-05-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-18 20:10:18 IP:61.219.xxx.xxx 未訂閱
我是想經由DLL中的程序碼來更改呼叫該DLL中的變數內容, 呼叫MyDllFunction(1,@sData1,@sData2,@sData3,@sData4); 我想經由DLL更改sData1,sData2,sData3,sData4變數內容, 我想經由指定位置/指針(Pointer)方式來修改變數內容, 希望各位前輩指導,,謝謝.
chfamy
中階會員


發表:87
回覆:161
積分:54
註冊:2002-05-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-18 20:10:34 IP:61.219.xxx.xxx 未訂閱
我是想經由DLL中的程序碼來更改呼叫該DLL中的變數內容, 呼叫MyDllFunction(1,@sData1,@sData2,@sData3,@sData4); 我想經由DLL更改sData1,sData2,sData3,sData4變數內容, 我想經由指定位置/指針(Pointer)方式來修改變數內容, 希望各位前輩指導,謝謝.
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-18 22:22:50 IP:61.222.xxx.xxx 未訂閱
1. 您在 DLL 中定義為PCHAR 故使用時,也應為PCHAR。 2. 使用PCHAR  必須先向記憶體申請位置。可透過 GetMem及 FreeMeM 指令。
var
  sData1: PCHAR;
  sData2: PCHAR;
  sData3: PCHAR;
  sData4: PCHAR;
begin
  GetMem(sData1,預計使用大小);
  GetMem(sData2,預計使用大小);
  GetMem(sData3,預計使用大小);
  GetMem(sData4,預計使用大小);      MyDllFunction(1,sData1,sData2,sData3,sData4);      FreeMem(sData1);
  FreeMem(sData2);
  FreeMem(sData3);
  FreeMem(sData4);
end;
3. 如果您堅持要使用 String 代入 也必須先用 SetLength 設定字串長度。
chfamy
中階會員


發表:87
回覆:161
積分:54
註冊:2002-05-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-23 07:18:19 IP:61.219.xxx.xxx 未訂閱
使用wameng建議而是無法傳回相關數值    function MyDllFunction(iFunction: Integer;Lp1,Lp2,Lp3,Lp4: PChar): PChar;  StdCall; External 'MyDLL.dll';    procedure TForm1.Button1Click(Sender: TObject); var sData1: pPChar; sData2: pPChar; sData3: pPChar; sData4: pPChar; begin   GetMem(sData1,30); GetMem(sData2,30); GetMem(sData3,30); GetMem(sData4,30); Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit4.Text := ''; sDefData1 := Edit1.Text; sDefData2 := Edit2.Text; sDefData3 := Edit3.Text; sDefData4 := Edit4.Text; MyDllFunction(1, @sData1, @sData2, @sData3, @sData4); Edit1.Text := sData1; Edit2.Text := sData2; Edit3.Text := sData3; Edit4.Text := sData4; FreeMem(sData1); FreeMem(sData2); FreeMem(sData3); FreeMem(sData4); end;
chfamy
中階會員


發表:87
回覆:161
積分:54
註冊:2002-05-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-23 07:26:59 IP:61.219.xxx.xxx 未訂閱
小弟不才不會使用Pointer,所以改用(var方式應急,還請各位大大指導. DLL部份程式碼: library MyDLL; uses SysUtils, Classes; function Get_DllData(var pDllData1,pDllData2,pDllData3,pDllData4: PChar): PChar; begin try pDllData1 := PChar('11'); pDllData2 := PChar('22'); pDllData3 := PChar('33'); pDllData4 := PChar('44'); Result := '0'; except Result := '1'; end; end; function MyDllFunction(iFunction: Integer;var Lp1,Lp2,Lp3,Lp4: PChar): PChar; StdCall; begin case (iFunction) 1: Result := Get_DllData(Lp1,Lp2,Lp3,Lp4); 2: Result := Get_DllData(Lp2,Lp3,Lp4,Lp1); 3: Result := Get_DllData(Lp3,Lp4,Lp1,Lp2); 4: Result := Get_DllData(Lp4,Lp1,Lp2,Lp3); end; end; exports MyDllFunction name 'MyDllFunction'; begin end. 呼叫DLL-Function部份程式碼: function MyDllFunction(iFunction: Integer;var Lp1,Lp2,Lp3,Lp4: PChar): PChar; StdCall; External 'MyDLL.dll'; procedure TForm1.Button1Click(Sender: TObject); var sData1: PChar; sData2: PChar; sData3: PChar; sData4: PChar; begin Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit4.Text := ''; sDefData1 := Edit1.Text; sDefData2 := Edit2.Text; sDefData3 := Edit3.Text; sDefData4 := Edit4.Text; MyDllFunction(1, sData1, sData2, sData3, sData4); Edit1.Text := sData1; Edit2.Text := sData2; Edit3.Text := sData3; Edit4.Text := sData4; end;
系統時間:2024-07-03 20:42:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!