DLL 的Form 錯誤 |
缺席
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
請問我的密碼輸入畫面是寫在dll中,當我去呼叫此dll form時,若按下右上角的關閉鈕,就發生
我寫了一之密碼輸入的程式,是使用DLL方式,但是當我去call 此dll時 ,
秀出的密碼輸入畫面,我若按下右上角的關閉鈕,就會出現錯誤!!
應用程式發生例外錯誤...
unit XcqCheck; interface uses
sharemem,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Mask,Registry, DB, DBTables; type
TForm1 = class(TForm)
Query1: TQuery;
GroupBox1: TGroupBox;
Label1: TLabel;
MaskEdit1: TMaskEdit;
Label2: TLabel;
MaskEdit2: TMaskEdit;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
Function Check():Boolean;
Function CheckReg():Boolean;//檢查程式是否在註冊表中註冊。
Procedure CreateReg();
function GetRegInfo():Boolean;
public
{ Public declarations }
end; var
Form1: TForm1;
B_Check: Boolean;//驗證輸入密碼的正確性
PName:string; //總體變數,存放用戶名和註冊碼。
PPass:integer;
function CheckPassword():Boolean;
function GetUserName():String;
implementation {$R *.dfm}
function CheckPassword():Boolean;
begin
B_Check := False;
Form1 := TForm1.Create(Application);
//創建密碼輸入框
Form1.ShowModal;//顯示密碼輸入框;
Result := B_Check;//返回給調用本dll的應用程式判斷
Form1.Free;//釋放本dll文件所占資源
end;
function GetUserName():String;
begin
result:=PName;
end; Procedure TForm1.CreateReg(); //創建用戶資訊
var Rego:TRegistry;
begin
Rego:=TRegistry.Create;
Rego.RootKey:=HKEY_USERS;
Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',True);//鍵名?AngelSoft\Demo,可自行修改。
Rego.WriteString('Name',PName);//寫入用戶名。
Rego.WriteInteger('Pass',PPass);//寫入註冊碼。
Rego.Free;
BitBtn1.Caption :='確定';
ShowMessage('程式已經註冊,謝謝!');
//寫入資料庫
query1.SQL.Add('insert into ctlxxzz values(' '''' maskedit1.Text '''' ',');
query1.SQL.Add('''' Maskedit2.Text '''' ')');
query1.ExecSQL ;
B_Check := True;
Close;
//CheckReg; //刷新。
end;
Function TForm1.CheckReg():Boolean;//檢查程式是否在註冊表中註冊。
var Rego:TRegistry;
begin
Rego:=TRegistry.Create;
Rego.RootKey:=HKEY_USERS;
IF Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',False) then
begin
result:=True;
// BitBtn1.Enabled:=false;
PName:=rego.ReadString('Name');//讀用戶名。
PPass:=Rego.ReadInteger('Pass'); //讀註冊碼。
rego.Free;
{ result:=False;
if Pname=MaskEdit1.Text then
if inttostr(PPass)=MaskEdit2.Text then}
result:=True;
end
else result:=False;
end;
function TForm1.GetRegInfo():Boolean;//檢查程式是否在註冊表中註冊。
var Rego:TRegistry;
begin
Rego:=TRegistry.Create;
Rego.RootKey:=HKEY_USERS;
IF Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',False) then
begin
result:=True;
// BitBtn1.Enabled:=false;
PName:=rego.ReadString('Name');//讀用戶名。
PPass:=Rego.ReadInteger('Pass'); //讀註冊碼。
rego.Free;
result:=False;
if Pname=MaskEdit1.Text then
if inttostr(PPass)=MaskEdit2.Text then
result:=True;
query1.SQL.Add('select key2 from ctlxxzz where key1=' '''' pname '''');
query1.open;
if query1.FieldByName('key2').AsInteger=ppass then
result:=True
else
result:=False;
end
else result:=False;
end; Function TForm1.Check():Boolean;//檢查註冊碼是否正確。
var
Temp:pchar;
Name:string;
c:char;
i,Long,Pass:integer;
begin
Pass:=0;
Name:=Maskedit1.Text;
long:=length(Name);
for i:=1 to Long do begin
temp:=pchar(copy(Name,i,1));
c:=temp^;
Pass:=Pass ord(c); //將用戶名每個字元轉換?ASCII碼後相加。
end;
if MaskEdit2.Text='' then
MaskEdit2.Text:='0';
if StrToInt(MaskEdit2.Text)=pass then begin
Result:=True;
PName:=Name;
PPass:=Pass;
end
else Result:=False;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
B_Check:=False;
if (MaskEdit1.Text <>'') And (MaskEdit2.Text <>'') then begin
if not CheckReg() then begin
if Check() then
CreateReg
else ShowMessage('註冊碼不正確,無法註冊');
end
else begin
B_Check := GetRegInfo();
if B_Check then
Close;
end;
end;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
if not CheckReg() then
BitBtn1.Caption :='註冊'
else
BitBtn1.Caption :='確定';
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not B_check then
application.Terminate ;
end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=VK_RETURN) then // 按Enter
begin
SelectNext(ActiveControl, True, true); // 到下一輸入元件
key:=0;
end;
end; end.
library CheckPasswordForm; { Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. } uses
SysUtils,
Classes,
XcqCheck in 'XcqCheck.pas' {Form1}; {$R *.res} exports
CheckPassword name 'CheckPassword',//dll入口
GetUserName name 'GetUserName';//dll入口
begin
end.
unit XcqCheck; interface uses
sharemem,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Mask,Registry, DB, DBTables; type
TForm1 = class(TForm)
Query1: TQuery;
GroupBox1: TGroupBox;
Label1: TLabel;
MaskEdit1: TMaskEdit;
Label2: TLabel;
MaskEdit2: TMaskEdit;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
Function Check():Boolean;
Function CheckReg():Boolean;//檢查程式是否在註冊表中註冊。
Procedure CreateReg();
function GetRegInfo():Boolean;
public
{ Public declarations }
end; var
Form1: TForm1;
B_Check: Boolean;//驗證輸入密碼的正確性
PName:string; //總體變數,存放用戶名和註冊碼。
PPass:integer;
function CheckPassword():Boolean;
function GetUserName():String;
implementation {$R *.dfm}
function CheckPassword():Boolean;
begin
B_Check := False;
Form1 := TForm1.Create(Application);
//創建密碼輸入框
Form1.ShowModal;//顯示密碼輸入框;
Result := B_Check;//返回給調用本dll的應用程式判斷
Form1.Free;//釋放本dll文件所占資源
end;
function GetUserName():String;
begin
result:=PName;
end; Procedure TForm1.CreateReg(); //創建用戶資訊
var Rego:TRegistry;
begin
Rego:=TRegistry.Create;
Rego.RootKey:=HKEY_USERS;
Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',True);//鍵名?AngelSoft\Demo,可自行修改。
Rego.WriteString('Name',PName);//寫入用戶名。
Rego.WriteInteger('Pass',PPass);//寫入註冊碼。
Rego.Free;
BitBtn1.Caption :='確定';
ShowMessage('程式已經註冊,謝謝!');
//寫入資料庫
query1.SQL.Add('insert into ctlxxzz values(' '''' maskedit1.Text '''' ',');
query1.SQL.Add('''' Maskedit2.Text '''' ')');
query1.ExecSQL ;
B_Check := True;
Close;
//CheckReg; //刷新。
end;
Function TForm1.CheckReg():Boolean;//檢查程式是否在註冊表中註冊。
var Rego:TRegistry;
begin
Rego:=TRegistry.Create;
Rego.RootKey:=HKEY_USERS;
IF Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',False) then
begin
result:=True;
// BitBtn1.Enabled:=false;
PName:=rego.ReadString('Name');//讀用戶名。
PPass:=Rego.ReadInteger('Pass'); //讀註冊碼。
rego.Free;
{ result:=False;
if Pname=MaskEdit1.Text then
if inttostr(PPass)=MaskEdit2.Text then}
result:=True;
end
else result:=False;
end;
function TForm1.GetRegInfo():Boolean;//檢查程式是否在註冊表中註冊。
var Rego:TRegistry;
begin
Rego:=TRegistry.Create;
Rego.RootKey:=HKEY_USERS;
IF Rego.OpenKey('.DEFAULT\Software\AngelSoft\Demo',False) then
begin
result:=True;
// BitBtn1.Enabled:=false;
PName:=rego.ReadString('Name');//讀用戶名。
PPass:=Rego.ReadInteger('Pass'); //讀註冊碼。
rego.Free;
result:=False;
if Pname=MaskEdit1.Text then
if inttostr(PPass)=MaskEdit2.Text then
result:=True;
query1.SQL.Add('select key2 from ctlxxzz where key1=' '''' pname '''');
query1.open;
if query1.FieldByName('key2').AsInteger=ppass then
result:=True
else
result:=False;
end
else result:=False;
end; Function TForm1.Check():Boolean;//檢查註冊碼是否正確。
var
Temp:pchar;
Name:string;
c:char;
i,Long,Pass:integer;
begin
Pass:=0;
Name:=Maskedit1.Text;
long:=length(Name);
for i:=1 to Long do begin
temp:=pchar(copy(Name,i,1));
c:=temp^;
Pass:=Pass ord(c); //將用戶名每個字元轉換?ASCII碼後相加。
end;
if MaskEdit2.Text='' then
MaskEdit2.Text:='0';
if StrToInt(MaskEdit2.Text)=pass then begin
Result:=True;
PName:=Name;
PPass:=Pass;
end
else Result:=False;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
B_Check:=False;
if (MaskEdit1.Text <>'') And (MaskEdit2.Text <>'') then begin
if not CheckReg() then begin
if Check() then
CreateReg
else ShowMessage('註冊碼不正確,無法註冊');
end
else begin
B_Check := GetRegInfo();
if B_Check then
Close;
end;
end;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
if not CheckReg() then
BitBtn1.Caption :='註冊'
else
BitBtn1.Caption :='確定';
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not B_check then
application.Terminate ;
end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=VK_RETURN) then // 按Enter
begin
SelectNext(ActiveControl, True, true); // 到下一輸入元件
key:=0;
end;
end; end.
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |