Delphi捕捉DLL执行所抛出的异常。
2010-08-06 17:03
399 查看
先来说一下我如何写我的Dll文件的。
先看代码:
代码
unit frm_LoginU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, pub_Event;
type
Tfrm_Login = class(TForm)
E_User: TEdit;
E_PassWD: TEdit;
btn_Login: TButton;
btn_Exit: TButton;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure btn_ExitClick(Sender: TObject);
procedure btn_LoginClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
DoLoginClick: TLoginClickEvent;
DoErrCatch:TExceptionEvent;
end;
var
frm_Login: Tfrm_Login;
implementation
{$R *.dfm}
procedure Tfrm_Login.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
Key := #0;
Keybd_Event(VK_TAB, 0, 0, 0);
end;
end;
procedure Tfrm_Login.btn_ExitClick(Sender: TObject);
begin
self.close;
end;
procedure Tfrm_Login.btn_LoginClick(Sender: TObject);
begin
if Assigned(DoLoginClick) then
begin
try
DoLoginClick(trim(E_User.Text), Trim(E_PassWD.Text));
except on e:Exception do
DoErrCatch(sender,e);
end;
end;
end;
procedure Tfrm_Login.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
end.
全部都出来了,我说下我这个DLL的登录验证窗体的工作方式:把登录的验证方法放在主程序里面,因为,不同时期不同的开发项目,其登录验证方式都不一样,因此独立出主程序里,采用回调的方式来实现。由于登录窗体需要到数据库中去验证帐号和密码,因此,我特意把字段输错,这里所报的异常不会被主程序捕捉到,为何不会被主程序捕捉到?我猜是因为调用这个验证方法是一个DLL,而DLL毕竟不是主程序,因此,其错误消息是不会被主程序所捕捉到的,就算开始的时候把application传到了dll里面去也一样捕捉不到(如果能捕捉到的,请把方法告诉我,我找了很久都没找到相关的资料),在网上找了个资料,网址是:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3660866
根据这个提示,我把异常处理的方法也传进去了,这样,在验证登录方法时出错了,也能调用主程序中的捕捉异常的方法。
原创作品出自努力偷懒,转载请说明文章出处:http://www.cnblogs.com/kfarvid/
先看代码:
代码
unit frm_LoginU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, pub_Event;
type
Tfrm_Login = class(TForm)
E_User: TEdit;
E_PassWD: TEdit;
btn_Login: TButton;
btn_Exit: TButton;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure btn_ExitClick(Sender: TObject);
procedure btn_LoginClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
DoLoginClick: TLoginClickEvent;
DoErrCatch:TExceptionEvent;
end;
var
frm_Login: Tfrm_Login;
implementation
{$R *.dfm}
procedure Tfrm_Login.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
Key := #0;
Keybd_Event(VK_TAB, 0, 0, 0);
end;
end;
procedure Tfrm_Login.btn_ExitClick(Sender: TObject);
begin
self.close;
end;
procedure Tfrm_Login.btn_LoginClick(Sender: TObject);
begin
if Assigned(DoLoginClick) then
begin
try
DoLoginClick(trim(E_User.Text), Trim(E_PassWD.Text));
except on e:Exception do
DoErrCatch(sender,e);
end;
end;
end;
procedure Tfrm_Login.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
end.
全部都出来了,我说下我这个DLL的登录验证窗体的工作方式:把登录的验证方法放在主程序里面,因为,不同时期不同的开发项目,其登录验证方式都不一样,因此独立出主程序里,采用回调的方式来实现。由于登录窗体需要到数据库中去验证帐号和密码,因此,我特意把字段输错,这里所报的异常不会被主程序捕捉到,为何不会被主程序捕捉到?我猜是因为调用这个验证方法是一个DLL,而DLL毕竟不是主程序,因此,其错误消息是不会被主程序所捕捉到的,就算开始的时候把application传到了dll里面去也一样捕捉不到(如果能捕捉到的,请把方法告诉我,我找了很久都没找到相关的资料),在网上找了个资料,网址是:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3660866
根据这个提示,我把异常处理的方法也传进去了,这样,在验证登录方法时出错了,也能调用主程序中的捕捉异常的方法。
原创作品出自努力偷懒,转载请说明文章出处:http://www.cnblogs.com/kfarvid/
相关文章推荐
- Delphi捕捉DLL执行所抛出的异常。(转)
- Delphi捕捉DLL执行所抛出的异常。
- AsyncHttpClient放在子线程执行时抛出异常的解决方法
- 外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常
- Python异常捕捉try except else finally有return时执行顺序探究
- java 方法超过执行时间后抛出异常
- 捕获Java线程池执行任务抛出的异常
- Delphi之Raise抛出异常
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
- CLisp 16:抛出和捕捉异常,try-catch机制
- 在XP系统中自带的 msvcrt.dll 和 Vista 中的 msvcrt.dll 版本不同,导致抛出的异常不同
- JAVA:内层方法抛出异常 外层方法捕捉并处理异常
- java中异常抛出后代码还会继续执行吗?
- Android:java 抛出异常throw与throws以及捕捉异常try、catch、finally学习
- string 类 用.at越界抛出异常捕捉
- throw在try中抛出异常,然后用catch捕捉并处理这个异常,同时catch也可以再次抛出这个异常
- Delphi 异常抛出与捕获
- bcb 如何在DLL中捕捉系统级异常
- spring事务、当业务中并没有异常抛出时执行一半的事务无法正常出发导致数据一致性遭到破坏、事务不起作用
- Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)