Q&A

  • 베타버젼 배포시에 한달간만 쓸 수 있게 하고싶은데 어떻게 해야 하나요?
이거 일전에 뽁기씨가 올려논 글인데 도움이 될거 같네여

항상 즐거운 프로그래밍 하시길~~



제가 일하는곳에 있는 개발프로그램중에 한 부분입니다..
소스가 좀 엉망인데요 (민망~)
대충 설명하면
맨처음 그 프로그램이 실행될때 레지스트리값이 존재하는지 판단하고
없으면 첨 실행된 시스템날짜를 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가 버그인가?????
0  COMMENTS
    • 김문식
    • 2003.06.18 23:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • shem
    • 2003.06.18 22:58
    • 1 COMMENTS
    • /
    • 0 LIKES
    • major
      2003.06.19 03:17
      안녕하세요,.. 일단은 미리보기를 하면 이미지 파일이 되어 버리기때문에... 제가 알기로는 미리보...
    • 성준범
      2003.06.18 23:15
      오라클에서는 이렇게 하는데 파라독스는 저런 함수가 있는지 모르겠네요... --; select C, COUNT(*) B ...
    • 제타
    • 2003.06.18 20:09
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 강형철
      2003.06.18 20:36
      이건 BDE랑 상관 없는 문제입니다~ 특정한 문자열에서 잘라내는 함수는 데이타베이스마다 다릅니다~ ...
    • KDDG_ZZOM
      2003.06.18 20:34
      BDE는 데이타 베이스가 아닌데...쩝... BDE는 ODBC처럼 데이타베이스를 연결시켜주는 다리역활을 해주는...
    • 전문성
    • 2003.06.18 19:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_RNStone
      2003.06.18 19:56
      탭이라면 #9를 붙이면 되지 않나요? Str := '123' + #9 + '456'; 이런식으로요.
    • 전문성
      2003.06.18 20:03
      감사합니다....ㅋㅋ
    • 미소^^
    • 2003.06.18 19:44
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 한석훈
    • 2003.06.18 19:35
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 프리맨
      2003.06.18 23:37
      var   ls_code: char; begin   ls_code:=PChar(edit1.text)^; end; 해설: &n...
    • 강형철
      2003.06.18 20:44
      간단히 이렇게 하시면 되겠네요.. var   ls_code : char; begin    if edit1.text...
    • 시지푸스
      2003.06.18 20:26
      형이 달라서 에러소지가 많을듯 한데요... 굳이 Char형을 쓰려면... var     &nb...
    • KDDG_ZZOM
      2003.06.18 20:08
      char형으로는 잘모겠고요... 그냥 PChar형으로 쓰셔도 될것같은데... Char, PChar나 형은 같을겁니다...
    • 작스
    • 2003.06.18 19:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2003.06.18 19:33
      var    i, j : Integer; begin   for i := 0 to ComponentCount - 1 do  &nb...
    • 최동석
    • 2003.06.18 19:18
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2003.06.18 20:30
      이상타??? 저는 deletefile로 삭제하면 그냥 지워지는데... 휴지통에 안들어가고...쩝... 아니면 us...
    • 최동석
      2003.06.18 21:03
      맞습니다. 다시 테스트 해보니 휴지통에 안들어가는게 맞군요. 테스트 할때 잘못판단을 했습니다. 예전...
    • 최은하
    • 2003.06.18 10:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 맑은물
      2003.06.18 14:40
      DBGrid1.Fields[0].Asstring 하면 받아올수 있습니다.
    • 박정찬
    • 2003.06.18 08:37
    • 2 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2003.06.18 19:17
      샬롬~ 여기 팁이나 질답게시판에 보시면 사이트 주소를 가지고 텍스트나 HTML소스로 로컬에 저장하는 ...
    • 박정찬
      2003.06.18 22:45
      HTML로 찾아보니 있네요. 감사 ^^ 검색을 하긴 했는데 정확히 맥(^^) 을 못짚었네요.
    • 파파앤민주
      2003.06.24 09:24
      제가 알기로는 오라클 클라이언트는 반드시 설치가 되어야하는걸로 알고 있습니다. 나머지는 자동으로 ...
    • 김형규
    • 2003.06.18 05:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 맑은물
      2003.06.18 14:41
      view - Component List 에서 찾으실수 있습니다.
    • 강지훈
    • 2003.06.18 04:12
    • 3 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2003.06.18 04:14
      환경변수에 Temp 값을 짧게 고쳐보세요. 제어판/시스템/고급/환경변수 -에서 WIN-XP에서는 'Temp' 의...
    • 강지훈
      2003.06.18 04:28
      먼저, 답변감사합니다. 제 PC(윈XP)상에서 Temp의 변수값은 짧게 변형되어있습니다. 고수님의 답변도 맞...
    • KDDG_ZZOM
      2003.06.18 18:54
      저 고수 아닌데요....쩝... 지금 일하는곳도 델3으로 개발하는데... win2000,xp에서는 이상하게도 출력...
    • 제타
    • 2003.06.18 02:49
    • 1 COMMENTS
    • /
    • 0 LIKES
    • ^ㅡ^
      2003.06.18 03:55
      //도움이되시길.. select substr(c,1,7) ,count(*) from a //테이블 group by substr(c,1,7) substr ...
    • 제타
    • 2003.06.18 02:24
    • 3 COMMENTS
    • /
    • 0 LIKES
    • hahaha
      2003.06.18 02:42
      select substr(c,1,4)  Year, substr(c,6,2) Month, count(*) MemberCount   from ...
    • 시지푸스
      2003.06.18 20:33
      mssql에서 되려나...?? 일단 substr을 substring으로 바꾸고... 그리구 아래식으로 그룹짓는게 mssql에선...
    • KDDG_ZZOM
      2003.06.18 02:35
      데이타베이스가 뭔지를 알아야 좀더 정확한 답변이 올라올것같네요... select 년월,count(*)   ...
    • 박준영
    • 2003.06.18 02:08
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 허저빙
      2003.06.18 02:29
      제가 야매 델파이라서..;; 훔;; 야매 방법인지는 모르것지만...;; 도움이 되길 바라면서링..;; 옵션에 ...
    • 박준영
      2003.06.18 02:51
      설명 하신대로 했더니.. 뭐가 뜨러구요..^^; 억세스2000(오피스2000에 포함된거)로 DB를 만들어서 보니 ...
    • 허저빙
      2003.06.18 02:58
      그건.. 얼라이어스..셋팅을 담아두는 ini 인거 같더라구영.... 아무데나.?? 흠암튼... 님이주고 싶은 이...
    • ^^
    • 2003.06.18 02:01
    • 1 COMMENTS
    • /
    • 0 LIKES
    • major
      2003.06.18 04:08
      안녕하세염... 일단 컴포넌트같은건 설정이 다 되어 있겠져? 그러시면 바로 Insert 문을 때려 보시...