• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        在Delphi中編制軟件版權保護控件

        在Delphi中編制軟件版權保護控件

        更新時間:2022-05-09 文章作者:未知 信息來源:網絡 閱讀次數:

        一、概述
        軟件作為一種人類智力勞動成果的一種表現形式,融會了設計者和開發者辛勤的勞動和汗水,然而,由于用戶觀念上的差異和盜版軟件的泛濫,軟件開發者的權益往往得不到有效的保護,因此,作為必要的手段-----軟件的自身保護也就在特定的環境下被重視起來。
        然而,正所謂,“魔高一尺,道高一丈”,保護和破解的矛盾關系在始終持續著,要想找到一種萬能的保護方法,卻也不是那么簡單的事。但是,如果開發者使用的保護手段連一般用戶都能破解的話(如:修改系統日期),這樣的保護則顯然達不到保護軟件版權的目的。
        基于此,筆者利用Delphi5.0面向對象的特性,設計開發了一個實用的版權保護控件,以為程序開發者提供一種簡易的軟件保護手段。
        二、實現方法
        1.在Delphi5.0中新建一個單元文件,書寫代碼如下,保存:
        unit RegObj;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Forms;

        type
        TRegObj = class
        private
        FSerial: string; //主板序列號
        FKey: string; //密碼
        FMaxTimes: Integer; //最大運行次數
        FCompany: string; //公司名稱
        FEmail: string; //聯系用的電子郵件
        protected
        procedure SetSerial; //取得主扳的序列號
        procedure GetKey; //從用戶序列號文件中讀取序列號
        function GetTimes: Integer; //從文件中讀取程序的運行次數
        function CheckKey: Boolean; //檢查序列號和密碼是否匹配的函數
        public
        constructor Create;
        function Execute: Boolean; //運行對象方法
        published
        property Company: string read FCompany write FCompany;
        property MaxTimes: Integer read FMaxTimes write FMaxTimes;
        property Email: string read FEmail write FEmail;
        end;

        implementation

        //TRegObj.
        constructor TRegObj.Create;
        begin
        inherited;
        end;

        function TRegObj.GetTimes: Integer;
        Const
        //用于存儲運行次數的文件,開發人員可自定義或使用注冊表存儲運行次數
        //起此名字用于迷惑破解者,使用前不要和系統的動態鏈接庫同名
        Tmp = 'ispnet.dll';
        var
        Ch: Char;
        Dir: array [0..255] of Char;
        Fn: string;
        I : Integer;
        List: Tstrings;
        begin
        //取得Windows系統的目錄
        GetSystemDirectory(@Dir, 255);
        For I := 0 to 255 do
        begin
        if Ord(Dir[I]) = 0 then Break;
        Fn := Fn + Dir[I];
        end;
        Fn := Fn + '\' + Tmp;
        try
        List := TStringList.Create;
        if Not FileExists(Fn) then
        Ch := Chr(1)
        else
        begin
        List.LoadFromFile(Fn);
        Ch := List.Text[1];
        Ch := Chr(Ord(Ch) + 1);
        end;
        List.Text := Ch;
        //存儲運行次數
        List.SaveToFile(Fn);
        Result := Ord(Ch);
        finally
        List.Free;
        end;
        end;

        procedure TRegObj.SetSerial;
        begin
        //取得主板的序列號
        FSerial := String(Pchar(Ptr($FEC71)));
        end;

        //取得密碼
        procedure TRegObj.GetKey;
        const
        Sn = 'Key.dat';
        var
        List: TStrings;
        Fn, Path: string;
        begin
        Path := ExtractFilePath(Application.ExeName);
        Fn := Path + Sn;
        if Not FileExists(Fn) then
        begin
        FKey := '';
        Exit;
        end;
        try
        List := TStringList.Create;
        List.LoadFromFile(Fn);
        FKey := List.Values['Key'];
        finally
        List.Free;
        end;
        end;

        function TRegObj.CheckKey: Boolean;
        begin
        //開發人員根據自己的需要進行修改,在這里是為了簡單起見
        Result := FKey = FSerial;
        end;

        function TRegObj.Execute: Boolean;
        var
        Msg: string;
        T: Integer;
        begin
        T := GetTimes;
        GetKey;
        SetSerial;
        if FKey <> FSerial then
        begin
        Msg := ' 您這是第' + IntToStr(T) + '次運行此程序(最大次數:' + IntToStr(FMaxTimes) + ')!';
        Application.MessageBox(PChar(Msg), '用戶信息', Mb_Ok + Mb_IconWarning);
        Msg := '歡迎使用' + Company + '的軟件,如果您覺得滿意的話,請注冊或購買正版軟件!';
        Application.MessageBox(PChar(Msg), '建議', Mb_Ok + Mb_IconInformation);
        if T > FMaxTimes then
        begin
        if Application.MessageBox(' 是否注冊?', '注冊', Mb_YesNo + Mb_IconQuestion) = Id_Yes then
        begin
        Msg := '您的注冊號是:“' + FSerial + '”' + Chr(13) + Chr(10) +
        '請您將以上序列號通過電子郵件寄給以下信箱:' + FEmail;
        Application.MessageBox(PChar(Msg), '軟件 注冊', Mb_Ok + Mb_Iconinformation);
        end;
        Application.Terminate;
        end;
        end;
        end;

        end.
        2.控件的使用
        在Delphi5.0中新建一個應用程序,在程序的引用單元中加入上述單元的引用,在主窗體的OnCreate事件中編寫如下代碼:
        procedure TForm1.FormCreate(Sender: TObject);
        var
        AObj: TRegObj;
        begin
        try
        AObj := TRegObj.Create;
        AObj.MaxTimes := 30;
        AObj.Company := '吉星軟件工作室';
        AObj.Email := 'test@1112.net';
        AObj.Execute;
        finally
        AObj.Free;
        end;
        end;
        三、結束語
        上述控件通過取得用戶計算機的主板序列號作為注冊碼,通過文件存儲程序運行次數和密鑰,防止了同樣的注冊碼和密鑰在不同的計算機上都可以使用的問題,而且,用戶通過簡單的日期修改無法使程序繼續,基本達到了軟件版權保護的目的。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 57pao国产成永久免费视频| 国产一区视频在线免费观看| h视频在线观看免费网站| 日韩毛片无码永久免费看| 亚洲精品自在在线观看| 亚洲中文字幕久久久一区| 久久毛片免费看一区二区三区| 国产成人福利免费视频| 国产精品亚洲产品一区二区三区| 亚洲国产视频一区| av片在线观看永久免费| 成人啪精品视频免费网站| 亚洲国产高清视频| 午夜成人无码福利免费视频| 曰批全过程免费视频在线观看 | 国产成人无码免费看视频软件| 亚洲欧洲日产国码二区首页 | 国产在线不卡免费播放| 亚洲一区二区中文| 免费无码一区二区三区蜜桃| 亚洲国产一区视频| 亚洲国产无线乱码在线观看| 黄在线观看www免费看| 亚洲视频无码高清在线| 国产精品免费精品自在线观看| 亚洲AV无码乱码在线观看代蜜桃 | 亚洲ⅴ国产v天堂a无码二区| 久久国产福利免费| 亚洲一区二区影院| 免费无码不卡视频在线观看| 亚洲综合久久一本伊伊区| 永久黄色免费网站| 亚洲AV成人片无码网站| 成年人免费视频观看| 日本免费精品一区二区三区 | 污污免费在线观看| 亚洲s色大片在线观看| 在线免费观看伊人三级电影| 国产精品亚洲综合一区| 一级毛片视频免费| 国产成人精品久久亚洲高清不卡 |