🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
本例用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)