在做DLL中发现主程序退出时老是报 runtime 216 错误。
进一步排查发现
DLL中
   空窗体      不报错。
   加上一个EDIT 不报错
   加上一个EDIT 加一个按钮 按下按扭时 self.modalResult:=mrOK  不报错
   加上一个 OracleSession,OracleDataSet 不报错
   加上一个按钮,去掉OracleSession,由主程序传一个OracleSession进DLL中,并设置 OracleDataSet的Session为 OracleSession.click按钮时打开 OracleDataSet,并在 DataGrid 中显示数据(sql语句为 select * from emploee),不报错。
   加上另一个OracleDataSet2,写sql语句(直接在属性中设定,并非由程序生成后传入) select Fullname from emploee where username='Admin',执行,不取数据,  不报错。
   如上,取得Fullname(字符串型Oracle 中描述为 VarChar2),写在Edit2中,得到正确的FUllname,所取得Fullname不返回主程序。   不报错。代码如下  try
   OracleDataSet2.Close;
   OracleDataSet2.Open;
   edt2.Text:=OracleDataSet2.FieldValues['Fullname'];
   showmessage('Execute OK');
  except
    showmessage('Execute Error');
  end;  结果不出错,提示 Execute OK  如上,改为
  var
    sql:string;
  begin
    sql:='select fullname from emploee where username='+quotedstr('Admin');
   OracleDataSet2.Close;
   OracleDataSet2.SQL.Clear;
   OracleDataSet2.SQL.Add(sql);
   OracleDataSet2.Open;
   edt2.Text:=OracleDataSet2.FieldValues['Fullname'];
 end;
 
  可正确执行,并取得 Fullname,但关闭主窗体的产生 RunTime 216 错误。
  我原以为所说的DLL中不要以 String  作参数,只是主窗传参数进DLL时,没想到呀,DLL自己内部也不能用String 遂改为:
 var
    sql:Pchar;
  begin
    sql:=Pchar('select fullname from emploee where username='+quotedstr('Admin'));
   OracleDataSet2.Close;
   OracleDataSet2.SQL.Clear;
   OracleDataSet2.SQL.Add(sql);
   OracleDataSet2.Open;
   edt2.Text:=OracleDataSet2.FieldValues['Fullname'];
 end;
 
  执行正确,并取得Fullname,返回主程序,没有报错。高兴中...  在此DLL窗体中点一次此按扭,正确,点两次,正确,点三次(即触发执行三次上面的程序段)运行正常,但主窗体关闭时出现 Runtime 216 错误。  为什么三次就出错?想破头,不明白。我现在是不是最高只能给100分?