DLL代码
library KeyboardDLL;uses
ShareMem,
SysUtils,
Windows,
ComObj,
ActiveX,
Forms,
Buttons,
Classes,
ADODB;
{$R *.res}Function Tcs_keyboard_Pro(ADOQuery1:TADOQUERY;FORM1:TFORM;Tcs_keyboard_onClick:Tnotifyevent):STRING;stdcall;
var
I:integer;
iHtoH:integer;
iWtoW:integer;
iWidth :integer;
BtnArr4:array[1..500] of TSpeedButton;
iCount4 :integer;
iPerLine4 : integer;//每行个数
begin
iHtoH := 2; //行间距
iWtoW := 2; //列间距
iWidth := 45; //按钮宽度 with ADOQuery1 do
begin
close;
SQL.Clear;
SQL.add('SELECT * FROM KeyBoard ORDER BY PS');
Open;
end; iCount4:=ADOQuery1.RecordCount;
iPerLine4:= FORM1.ClientWidth div (iWidth+iWtoW);
for I := 1 to iCount4 do
begin
BtnArr4[i] := TSpeedButton.Create(FORM1);
with BtnArr4[i] do
begin
show;
name:='K'+ADOQuery1.fieldbyname('keyvalue').asstring;
height:=40;
width:=iWidth;
Caption := ADOQuery1.fieldbyname('keyname').asstring;
font.Size:=12;
onclick:=Tcs_keyboard_onClick;
Parent :=FORM1;
Left:= iWtoW + (iWidth+iWtoW) * ((i-1) mod iPerLine4);
Top:= iHtoH + (height+iHtoH) * ( i div iPerLine4 - integer((i mod iPerLine4)=0));
ADOQuery1.Next();
end;
end;
result:='OK';
end;exports
Tcs_keyboard_Pro;
begin
end.
调用DLL的单元
unit Unit1;
interface
uses
ShareMem,Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DB, ADODB ;
type
TForm1 = class(TForm)
ADOQuery1: TADOQuery;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure Click(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;implementation{$R *.dfm}FUNCTION Tcs_keyboard_Pro(ADOQuery1:TADOQUERY;FORM1:TFORM;Tcs_keyboard_onClick:Tnotifyevent):string; stdcall;external 'KeyboardDLL.dll';procedure TForm1.Button1Click(Sender: TObject);
begin
Tcs_keyboard_Pro(ADOQuery1,form1,Click);
end;procedure TForm1.Click(Sender: TObject);
begin
showmessage('OK');
end;
end.可以成功调用,显示出所有的按钮。但是按每个按钮都没反应,而已关闭窗口的时候出现以下的错添提示:"工程Project2.exe检测到错误类EInvalidPointer,错误信息:‘Invalid Pointer Operation’.进程中止。使用单步或运行继续运行。"
library KeyboardDLL;uses
ShareMem,
SysUtils,
Windows,
ComObj,
ActiveX,
Forms,
Buttons,
Classes,
ADODB;
{$R *.res}Function Tcs_keyboard_Pro(ADOQuery1:TADOQUERY;FORM1:TFORM;Tcs_keyboard_onClick:Tnotifyevent):STRING;stdcall;
var
I:integer;
iHtoH:integer;
iWtoW:integer;
iWidth :integer;
BtnArr4:array[1..500] of TSpeedButton;
iCount4 :integer;
iPerLine4 : integer;//每行个数
begin
iHtoH := 2; //行间距
iWtoW := 2; //列间距
iWidth := 45; //按钮宽度 with ADOQuery1 do
begin
close;
SQL.Clear;
SQL.add('SELECT * FROM KeyBoard ORDER BY PS');
Open;
end; iCount4:=ADOQuery1.RecordCount;
iPerLine4:= FORM1.ClientWidth div (iWidth+iWtoW);
for I := 1 to iCount4 do
begin
BtnArr4[i] := TSpeedButton.Create(FORM1);
with BtnArr4[i] do
begin
show;
name:='K'+ADOQuery1.fieldbyname('keyvalue').asstring;
height:=40;
width:=iWidth;
Caption := ADOQuery1.fieldbyname('keyname').asstring;
font.Size:=12;
onclick:=Tcs_keyboard_onClick;
Parent :=FORM1;
Left:= iWtoW + (iWidth+iWtoW) * ((i-1) mod iPerLine4);
Top:= iHtoH + (height+iHtoH) * ( i div iPerLine4 - integer((i mod iPerLine4)=0));
ADOQuery1.Next();
end;
end;
result:='OK';
end;exports
Tcs_keyboard_Pro;
begin
end.
调用DLL的单元
unit Unit1;
interface
uses
ShareMem,Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DB, ADODB ;
type
TForm1 = class(TForm)
ADOQuery1: TADOQuery;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure Click(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;implementation{$R *.dfm}FUNCTION Tcs_keyboard_Pro(ADOQuery1:TADOQUERY;FORM1:TFORM;Tcs_keyboard_onClick:Tnotifyevent):string; stdcall;external 'KeyboardDLL.dll';procedure TForm1.Button1Click(Sender: TObject);
begin
Tcs_keyboard_Pro(ADOQuery1,form1,Click);
end;procedure TForm1.Click(Sender: TObject);
begin
showmessage('OK');
end;
end.可以成功调用,显示出所有的按钮。但是按每个按钮都没反应,而已关闭窗口的时候出现以下的错添提示:"工程Project2.exe检测到错误类EInvalidPointer,错误信息:‘Invalid Pointer Operation’.进程中止。使用单步或运行继续运行。"
只不过传到DLL中后不要进行显式或隐式的转型吧(反之亦然)
因为dll与exe维护着各自的的RTTI表