이거 일전에 뽁기씨가 올려논 글인데 도움이 될거 같네여
항상 즐거운 프로그래밍 하시길~~
제가 일하는곳에 있는 개발프로그램중에 한 부분입니다..
소스가 좀 엉망인데요 (민망~)
대충 설명하면
맨처음 그 프로그램이 실행될때 레지스트리값이 존재하는지 판단하고
없으면 첨 실행된 시스템날짜를 Encode시켜서 레지스트리에 보관하고
담에 다시 실행할때면 실행되는 날짜와 레지스트리에 기록된 날짜와 비교해서
한달이 넘으면 사용을 막아버립니다..
근데 중요한건 한번 한달이 넘어버리면 날짜를 1900-01-01로 기록해버려서
사용자가 임으로 날짜를 조작해서 사용하지못한다는거죠..
(이거 꽁수인것같음^^)
밑에 소스보시면
Section 부분이 있는데요 이 섹션이름을 사용자가 눈치못채게
어려운 이름이 바꾸시면 좋겠죠?
예를들어 'Usb Controller Setting' 등의 이름..
아래에선 폼show에다 걸었는데 원하시는 곳에 루틴을 활용하시기바랍니다..
그리고 소스 맨위에 상수로 값만 변경하면 데모 및 정품을 쉽게 변경가능할겁니다..
사실 전 이런거(날짜막아버리는거..) 젤 싫어하는데
회사에 있다보니 어쩔수없는 현실이군여..쩝..
그냥 이렇게도 쓸수있다는걸로 참고하세요
에러난다면 도망가야쥐..^^
좋은하루되세요~
Const ShareWare = False; // 데모버전(True) 정품(False) 구분
implementation
..
..
procedure TISPASSF.FormShow(Sender: TObject);
begin
if ShareWare then
ProgramRegist(Sender);
end;
procedure TISPASSF.ProgramRegist(Sender: TObject);
var
FIniFile:TRegIniFile;
Regist:TRegistry;
Section,Key,sPName:string;
a,b:Dword;
sRSV:TStrings;
H, C, D: String;
Ini :TIniFile;
BsMoneyCount, InputString: String;
function EncodeLock(H:String) : String;
var
Str : String;
i,j : integer;
begin
j := Length(H);
Str := H;
for i :=1 to Length(H) do
begin
Str[i] := chr(ord(Str[i]) + ord(Str[j]));
Dec(j);
end;
Result := Str;
end;
function DecodeLock(H:String) : String;
var
Str : String;
i,j : integer;
begin
j := Length(H);
Str := H;
for i :=1 to Length(H) do
begin
Str[j] := chr(ord(Str[j]) - ord(Str[i]));
Dec(j);
end;
Result := Str;
end;
begin
//Registry 읽고 쓰기
sRSV := TStringList.Create;
Key := '';
sRSV.Clear;
Regist := TRegistry.Create;
Regist.RootKey := HKEY_CURRENT_USER;
FiniFile := TRegIniFile.Create('SOFTWARE'); // License
Section := 'License'; // <= 이부분에 류응철님이 원하시는 레지스트리이름을 적으세요~
FiniFile.ReadSectionValues(Section,sRSV);
if (sRSV.Count = 0) then // 없으면 프로그램 시작일을 Registry에 저장한다.
begin
H := EncodeLock(FormatDateTime('YYYY-MM-DD',Date));
FiniFile.WriteString(Section,Section,H);
Application.MessageBox('"모모모" 프로그램으로 오신것을 환영합니다.'+#13#13 +
'이 프로그램은 연습용으로써 '+ #13#13 +
'최초 실행일부터 한달(30일)간 사용할 수 있습니다.', MB_OK);
Key := FiniFile.FileName;
sRSV.Free;
FiniFile.Free;
Regist.Free;
end
else
begin
a := Pos('=',sRSV[0]); b := Length(sRSV[0]);
H := DecodeLock(Copy(sRSV[0],a+1,b-a));
if (StrToDate(H) < Date - 30) or (StrToDate(H) > Date + 30) then
begin
if H <> '1900-01-01' then
begin
H := EncodeLock('1900-01-01');
FiniFile.WriteString(Section,Section,H);
end;
Application.MessageBox('"모모모" 프로그램 사용기간이 만료되었습니다.'+#13#13 +
'정품을 구입하시면 제한없이 사용할 수 있으며 ' +#13#13 +
'많은 해택을 드립니다.' ,'확인', MB_OK);
sRSV.Free;
FiniFile.Free;
Regist.Free;
Application.Terminate;
end
else
begin
Application.MessageBox('"모모모" 프로그램으로 오신것을 환영합니다.'+#13#13 +
'정품을 구입하시면 제한없이 사용할 수 있으며 ' +#13#13 +
'많은 해택을 드립니다.','확인', MB_OK);
Key := FiniFile.FileName;
sRSV.Free;
FiniFile.Free;
Regist.Free;
end;
end;
end;
그런데 제가 이소스를 가져다가 사용해봤는데...
Win98에서 컴파일해서 Win98에서 사용해보니까 잘 되는데..
문제는 Win98에서 컴파일해서 실행파일을 2000에서 실행해보니..
맨처음 실행할때는 잘 되는데..
그 담에 이 실행파일을 실행할때는 레지스트리에 있는 H값을
가져오는데..
바로 이부분..
a := Pos('=',sRSV[0]);
b := Length(sRSV[0]);
H := DecodeLock(Copy(sRSV[0],a+1,b-a));
Encode해서 레지스트리에 써준값을 DecodeLock해서 H값을 가져오는데..
98에서는 날짜포멧 그대로 2003-06-18 첨에 써준대로 가져오는데..
2000에서는 깨져서 가져오더라고요..?03-06-1 이렇게 가져오던군요..
Length는 10자리인데...
모가 문제인지 모르겠습니다..아시는분 답변좀 부탁합니다...
그런데 방금 2000에서 컴파일해서 해보니까 2000에서는 안되는군요..
98에서만 되더군요...
2000에서 되어야 하는데 아시는분 답변 부탁합니다..
DecodeLock가 버그인가?????