library Project1;
uses
SysUtils,
Classes,
Controls,
Forms,
Windows,
Unit1 in 'Unit1.pas' {FrmLogin};//登录对话框;var
Myconn:string; //定义公共变量,数据库连接字符串{$R *.res}Procedure SetConn(Conn:Pchar);Stdcall;
begin
Myconn:=StrPas(Conn);
end;function CheckPass(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar):Boolean;Stdcall;
var
FrmLogin:TfrmLogin;
ResultModal:integer;//窗体返回值
begin
opID:=pChar(''); opName:=pChar('');opUsername:=pchar('');Result:=false;
if Myconn='' Then exit;
Application.Handle:=Apphandle;
FrmLogin:=TFrmLogin.Create(nil);
try
FrmLogin.ADOQ.ConnectionString:=Myconn;
ResultModal:=FrmLogin.ShowModal;
if ResultModal = mrok then
begin
opID:=PChar(FrmLogin.SopID);
opName:=pchar(FrmLogin.Sopname);
opUsername:=pchar(FrmLogin.sopusername);
Result:=true;
end;
finally
FrmLogin.Free;
Application.Handle:=0;
end;
end;
exports
SetConn,CheckPass;
begin
end.
uses
SysUtils,
Classes,
Controls,
Forms,
Windows,
Unit1 in 'Unit1.pas' {FrmLogin};//登录对话框;var
Myconn:string; //定义公共变量,数据库连接字符串{$R *.res}Procedure SetConn(Conn:Pchar);Stdcall;
begin
Myconn:=StrPas(Conn);
end;function CheckPass(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar):Boolean;Stdcall;
var
FrmLogin:TfrmLogin;
ResultModal:integer;//窗体返回值
begin
opID:=pChar(''); opName:=pChar('');opUsername:=pchar('');Result:=false;
if Myconn='' Then exit;
Application.Handle:=Apphandle;
FrmLogin:=TFrmLogin.Create(nil);
try
FrmLogin.ADOQ.ConnectionString:=Myconn;
ResultModal:=FrmLogin.ShowModal;
if ResultModal = mrok then
begin
opID:=PChar(FrmLogin.SopID);
opName:=pchar(FrmLogin.Sopname);
opUsername:=pchar(FrmLogin.sopusername);
Result:=true;
end;
finally
FrmLogin.Free;
Application.Handle:=0;
end;
end;
exports
SetConn,CheckPass;
begin
end.
end;
initialization
CoInitialize(nil);finalization
CoUninitialize;
end.
try
FrmLogin.ADOQ.ConnectionString:=Myconn;
ResultModal:=FrmLogin.ShowModal;
if ResultModal = mrok then
begin
opID:=PChar(FrmLogin.SopID);
opName:=pchar(FrmLogin.Sopname);
opUsername:=pchar(FrmLogin.sopusername);
Result:=true;
end;
finally
FrmLogin.Free; <-- FrmLogin被释放了,opUsername,opName,opID的操作会产生不可预料的结果
Application.Handle:=0;
end;
function CheckPass(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar;Conn:Pchar):Boolean;Stdcall;
var
FrmLogin:TfrmLogin;
ResultModal:integer;//窗体返回值
begin
opID:=pChar('');
opName:=pChar('');
opUsername:=pchar('');
Result:=false; if Conn='' Then exit;
Application.Handle:=Apphandle;
FrmLogin:=TFrmLogin.Create(nil);
try
FrmLogin.ADOQ.ConnectionString:=Conn;
ResultModal:=FrmLogin.ShowModal;
if ResultModal = mrok then
begin
opID:=PChar(FrmLogin.SopID);
opName:=pchar(FrmLogin.Sopname);
opUsername:=pchar(FrmLogin.sopusername);
Result:=true;
end;
finally
FrmLogin.Free;
Application.Handle:=0;
end;
end;
exports
CheckPass;
begin
end.
//DLL部分
library Project1;
uses
SysUtils,
Classes,
Forms,
Controls, Unit1 in 'Unit1.pas' {FrmLogin};var
Myconn:string;
{$R *.res}
Procedure SetConn(Conn:Pchar);Stdcall;
begin
Myconn:=StrPas(Conn);
end;function CheckPass(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar):Boolean;Stdcall;
var
FrmLogin:TfrmLogin;
ResultModal:integer;//窗体返回值
begin
Result:=false;
if Myconn='' Then exit;
Application.Handle:=Apphandle;
FrmLogin:=TFrmLogin.Create(nil);
try
FrmLogin.ADOQ.ConnectionString:=Myconn;
ResultModal:=FrmLogin.ShowModal;
if ResultModal = mrok then
begin
StrPCopy(opID,FrmLogin.SopID.Text);
StrPCopy(opName,FrmLogin.Sopname.Text);
StrPCopy(opUsername,FrmLogin.sopusername.Text);
Result:=true;
end;
finally
FrmLogin.Free;
Application.Handle:=0;
end;
end;
exports
SetConn,CheckPass; begin
end.
//什么时候真正用到ADO操作,那么要及时进入套间,来初始化一下其工作环境
//调用程序
type
TSetConn=procedure (Conn:Pchar);stdcall;
TCheckPass=function(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar):boolean;stdcall;procedure TForm1.GetLogonForm;
var
DllHnd: THandle;
SetConn: TSetConn;
CheckPass:TCheckPass;
opID,opName,opUsername: PChar;
size:Integer;
begin
size:=255;
DllHnd := LoadLibrary(PChar('project1.dll'));
try
if (DllHnd <> 0) then
begin
@SetConn :=GetProcAddress(DllHnd, 'SetConn');
if (@SetConn<>nil) then
begin
SetConn('Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CSDNTest;Data Source=.');
@CheckPass :=GetProcAddress(DllHnd, 'CheckPass');
if (@CheckPass<>nil) then
begin
GetMem(opID,size);
GetMem(opName, size);
GetMem(opUsername,Size);
try
if CheckPass(Application.Handle,opID,opName,opUsername) then
showmessage('ok'); finally
FreeMem(opID);
FreeMem(opName);
FreeMem(opUsername);
end;
end;
end
else
begin
application.MessageBox(PChar('DLL加载出错,DLL可能不存在!'), PChar('错误'),
MB_ICONWARNING or MB_OK);
end;
end;
finally
FreeLibrary(DllHnd);
end;
end;