在做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分?
进一步排查发现
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分?
當exe 退出時, 調用, 該函數, 主動 free 你的窗體!