本例用delphi 7 編寫
編寫DLL就要遵守DLL規則。DLL規則,可以簡單地理解為 windows 規則。(以后簡稱 win 規則)
對于DLL函數的String參數,要特別設計。
先來看GetWindowText這個Win函數的調用方法
~~~
procedure TForm1.Button1Click(Sender: TObject);
// 本例為 D7, Char 默認是 AnsiChar
var
Buff: array[0..255] of char; //定義一塊內存,用于存放Window的標題。
sWndText: string;
begin
ZeroMemory(@Buff, 256); // Buff 清零,避免不必要的麻煩。
GetWindowText(self.Handle, Buff, 256); // 告訴函數,我提供了 256 個字節的 buff 供其使用。
sWndText := Buff; // 此句等價于 sWndtext:=String(PChar(@buff));
DispMsg(sWndText); // 輸出結果是 Form1
end;
~~~
為了調用此函數,我們先定義了一塊內存供函數使用,此為Win規則的推薦寫法。
為什么要這樣設計?這涉及到內存分配與釋放的問題。
由調用者提供BUFF與長度,在DLL函數中使用此塊內存,并由長度來控制邊界,
讓內存的歸屬問題變得簡單清晰。
好,下面我們來設計一個DLL函數:
菜單: File-->New-->Other... 切換到 New 標簽,選擇 DLL Wizard 再點擊 OK ,即可新建一個DLL工程。
~~~
library TestDLL;
uses
SysUtils, Classes;
{$R *.res}
// 本函數將Str反轉。如: abc 變成 cba
procedure ReverseStr(AInStr, AOutStr: PChar; ACount: integer); stdcall;
var
i: integer;
begin
inc(AInStr, ACount - 1);
for i := 0 to ACount - 1 do
begin
AOutStr^ := AInStr^;
Dec(AInStr);
inc(AOutStr);
end;
end;
exports // 輸出函數申明
ReverseStr;
begin
end.
~~~
寫好代碼,編譯后就可以得到 TestDLL.dll
再編寫一個調用此DLL函數的EXE工程。
~~~
// 雖然 delphi 對函數名大小寫不敏感
// 但是:在申明DLL函數的時候,大小寫一定要與DLL中的定義相同。
// 即此處 ReverseStr 不可寫成 reversestr
procedure ReverseStr(AInStr, AOutStr: PChar; ACount: integer); stdcall; external 'TestDLL.dll'; // 申明DLL
procedure TForm1.Button2Click(Sender: TObject);
var
sInStr: string;
sOutStr: string;
n: integer;
begin
sInStr := 'abcdefghijklmno';
n := Length(sInStr);
SetLength(sOutStr, n); // 給 sOutStr 分配空間
ReverseStr(PChar(sInStr), PChar(sOutStr), n);
DispMsg(sOutStr); // 輸出結果:onmlkjihgfedcba
end;
~~~
[本例源碼下載](https://www.jianguoyun.com/p/DbrONaMQxMf4BRjK1zs)
- 0.1 教程說明
- 0.2 delphi xe8 安裝
- 0.2.2 XE 10.3.3 安裝
- 0.3 delphi IDE 的非常必要的配置
- 0.4 調試中的異常處理
- 0.5 工程路徑設置
- 0.6 開發工具界面切換成中文的問題
- 一、實用技巧
- 0.嘗試為event取名叫伊文特
- 1.各種(變量)數據在內存中是什么樣子的?
- 2
- 3
- 4.亂碼問題
- 5
- 二、多線程
- 三、DLL相關
- 1.DLL中函數參數如何設計?
- 2.調用易語言DLL識別驗證碼
- 四、界面設計
- 1.關于解耦問題
- 2.登錄功能設計
- 五、面向對象基礎知識
- 1.窗口間傳遞值
- 3.避免又臭又長的裹腳布
- 2.擴展 TStringGrid , delphi 7 示例
- 六、初學者誤區集錦
- 七 TList 集合
- 1.附加信息Pointer設計
- 2.用 TList 來建立組件間的聯系
- 3.泛型 TList<T> 示例