指針(Pointer)如何在DLL中使用與呼叫 |
尚未結案
|
chfamy
中階會員 ![]() ![]() ![]() 發表:87 回覆:161 積分:54 註冊:2002-05-03 發送簡訊給我 |
拜讀前輩有關指針(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 發送簡訊給我 |
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 發送簡訊給我 |
|
chfamy
中階會員 ![]() ![]() ![]() 發表:87 回覆:161 積分:54 註冊:2002-05-03 發送簡訊給我 |
|
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
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 發送簡訊給我 |
使用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 發送簡訊給我 |
小弟不才不會使用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;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |