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’.进程中止。使用单步或运行继续运行。"

解决方案 »

  1.   

    对象根本就不跨越普通的dll传递的,除非你改用bpl。普通的dll会把它自己要引用的代码全编译到自己的模块里面,和exe各自有独立的内存分配程序。
      

  2.   

    你这问题很大,直接传入ado和form给dll,问题很多,建议,ado只传入连接串,在dll里面单独使用一个连接去处理数据,对于form1,你还需要把dll的application变为主程序的application,然后关闭时,还要回复,具体你查查吧,起一阵坛子里有这样的帖子
      

  3.   

    对象可以跨dll传递,只要双方对象的类的结构完全相同.
      

  4.   

    不是结构相同就行了,还有内存分配的问题,普通dll是把它引用的模块代码编译进去了,和主程序有各自的全局变量。
      

  5.   

    隐约地记着可以传递的(好几年不用D了)
    只不过传到DLL中后不要进行显式或隐式的转型吧(反之亦然)
    因为dll与exe维护着各自的的RTTI表