怎样做个DLL的登陆窗体,输入用户名和密码后由DLL连接数据库并验证!!详情请进。。(88分)

  • 主题发起人 主题发起人 幸福鸟
  • 开始时间 开始时间

幸福鸟

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样做个DLL的登陆窗体,输入用户名和密码后由DLL连接数据库并验证!!
我现在做了个dll窗体,但在上面放adoconnection控件和adoquery控件后运行时
出现错误,我的adoconnection和adoquery都已经配置好,
是布是dll不支持这样连接啊,该怎样办啊!!!!
dll是這樣的:
library ProjectDll;
uses
SysUtils,
Classes,
Forms,
Windows,
ufrmDll in 'ufrmDll.pas' {frmDll};
{$R *.res}
var
DLLApp: TApplication;
DLLScr: TScreen;
function TestDll(App: TApplication;
Scr: TScreen):TForm;
begin
Application := App;
Screen := Scr;
if frmDll=nil then
begin
Application.CreateForm(TfrmDll, frmDll);
frmDll.Show;
result:=frmDll;
end
else
result:=nil;
end;
procedure ExitDLL(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DLLApp;
Screen := DLLScr;
end;
end;
exports
TestDll;
begin
DLLApp := Application;
DLLScr := Screen;
DLLProc := @ExitDLL;
end.
dll窗體是這樣的,上面有adoconnection控件和adotable控件,都已經連接好
unit ufrmDll;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, Grids, DBGrids, ADODB;
type
TfrmDll = class(TForm)
Label1: TLabel;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
private
public
end;
var
frmDll: TfrmDll;
implementation
{$R *.dfm}
procedure TfrmDll.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
frmDll:=nil;
action:=cafree;
end;
在測試窗體中的button事件是這樣的
procedure TfrmDllTest.Button1Click(Sender: TObject);
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
begin
DLLHandle := LoadLibrary('ProjectDll.dll');
if DLLHandle <> 0 then
begin
@DLLSub := GetProcAddress(DLLHandle, 'TestDll');
if Assigned(DLLSub) then
begin
DLLForm := DLLSub(Application, Screen);
end;
end;
end;
運行後彈出錯誤
project projectDllTest.exe raised exception class EOleSysError With message 'CoInitialize 尚未被呼叫。',Process stopped.Use Step or Run to continue.
但我把adoconnection和adoquery 控件去掉就沒問題,不知錯那裡了啊?幫幫忙
 
---- 在我们编制Delphi应用程序,常常需要提供一个密码验证框,对应用程序的使用者进行身份核对。如果能有一个通用的密码验证框,便能够为我们的工作节约不少的时间,更能使我们编制的程序小而快。以下的程序为你提供了这样的一个DLL文件。
//文件名为CheckPasswordForm.dpr;
编译此文件生成CheckPasswordForm.dll
library CheckPasswordForm;
uses
XcqCheck in 'XcqCheck.pas' {XcqForm};
exports
CheckPassword name 'CheckPassword';//dll入口
begin
end.

//文件名为XcqCheck.pas
unit XcqCheck;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, Menus;
type
TXcqForm = class(TForm)
XcqEdit: TMaskEdit;//密码输入框
OkBtn: TButton;
procedure OkBtnClick(Sender: TObject);
end;

var
XcqForm: TXcqForm;
Check: Boolean;//验证输入密码的正确性
function CheckPassword: Boolean;export;
//本dll文件的关键实现
implementation
{$R *.DFM}
procedure TXcqForm.OkBtnClick(Sender: TObject);
begin
if XcqEdit.Text = 'xcq' then
Check := True;
Close;
end;

function CheckPassword;export;
begin
Check := False;
XcqForm := TXcqForm.Create(Application);
//创建密码输入框
XcqForm.ShowModal;//显示密码输入框;
注意:不能用XcqForm.Show!
Result := Check;//返回给调用本dll的应用程序判断
XcqForm.Free;//释放本dll文件所占资源
end;
end.

---- 在调用以上dll中CheckPassword函数的应用程序中只需加入以下语句在implementation 后,function CheckPassword: Boolean;
external 'CheckPasswordForm.dll' name 'CheckPassword';在需要进行密码验证的地方加入下面的条件语句就完全实现了密码验证的功能。
if CheckPassword then

begin
...//如XcqQuery.Open;
end;

---- 上面的程序只是一个简单的密码验证框,我们可以将密码以写入注册表或文件的方式保存,动态修改,更可以利用算术算法对密码进行简单的加密等,使要保密的数据更安全。
---- 其实,上文中如何在dll中实现窗口让我走了不少弯路,我觉得此法对大家更有意义,这是避免程序庞大的一种有效方法,不妨试试。

给你看真篇文章
 
但你驗證密碼沒有連接數據庫啊,我要連接數據庫的啊?
 
uses ActiveX, Variants
function TestDll(App: TApplication;
Scr: TScreen):TForm;
begin
Application := App;
Screen := Scr;
CoInitialize(nil);
^^^^^^^^^^^^^^^^^^^^^^^^^^
try
if frmDll=nil then
begin
Application.CreateForm(TfrmDll, frmDll);
frmDll.Show;
result:=frmDll;
end
else
result:=nil;
finally
CoUnInitialize;
^^^^^^^^^^^^^^^^^^^^^^^
end;
end;
 
在DLL最开始加CoInitialize初始化COM.
ADO是M$用COM技术实现的数据库访问接口,使用前必须先初始化。
EXE由VCL自动进行了,DLL则没有,要手工加。
此类应用最好用基于COM的DLL来实现。
library Project1;
uses
SysUtils, Classes;
{$R *.res}
begin
CoInitialize(nil);
{初始化COM}
end.
 
后退
顶部