全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1889
推到 Plurk!
推到 Facebook!

DLL 的Form 錯誤

缺席
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-07 10:49:55 IP:61.218.xxx.xxx 未訂閱
請問我的密碼輸入畫面是寫在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-07 11:06:09 IP:218.16.xxx.xxx 未訂閱
應是這句出錯罷 : application.Terminate ; 我很少玩DLL所以不大肯定,但在 DLL 裡面應不能直接使用 Application 這個物件 你應回傳一個 result 到主程式說明登入失敗再由主程式自行關閉。
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-07 11:08:52 IP:61.218.xxx.xxx 未訂閱
請問主程式要如何關閉Dll form
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-07 11:26:12 IP:218.16.xxx.xxx 未訂閱
dll form 自行關閉 Form 只是當Login失敗時,讓主程式執行 Application.Terminate 去關閉整個程式 而非在 DLL 裡執行
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-07 11:45:53 IP:61.218.xxx.xxx 未訂閱
procedure TForm1.FormCreate(Sender: TObject); begin if CheckPassword then begin v_user:=GetUserName(); Form1.Show ; end else application.Terminate ; end; 我在主程式這樣寫,但是還是出錯,我是直接按dll form上關閉按鈕, invaildpointer with message....
系統時間:2024-05-16 9:42:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!