통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Install Shield 포럼마을 입니다.
  마을등급 Install Shield   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 유석민 주민 764 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 자료실
 설치할 때 시리얼 넘버체크 하기(인스톨쉴드란에는 첨써봐용.)  | 인스톨쉴드 일반 2005-10-11 오후 6:33:09
 hahoetal05  hahoetal05님께 메시지 보내기hahoetal05님을 내 주소록에 추가합니다.hahoetal05님의 개인게시판 가기 번호: 19460  / 읽음:15,448

수 많은 고수 분들은 이미 알고 계실테지만, 이곳을 아무리~~~뒤져봐도 자료가 없어서 (제 경우에 말이죠) 이렇게

저와 같은 초짜분들 고생하실까봐 정보 공유합니당.

 

주제는 시리얼 넘버 체크하기구요. VC++6.0과 인스톨 쉴드 9.0환경에서 실행합니다.

 

제 경우 순서는 다음과 같이 했습니다.

 

[1단계 - 인스톨쉴드에 시리얼 넘버 체크할 부분을 위한 환경 만들기]

0. 설치할 프로그램을 만들고서 이것을 릴리즈 버젼으로 컴파일 했습니다.(Ctrl+F5키)

1. 인스톨 쉴드를 켭니다.

2. InstallScript MSI Project로 프로젝트를 하나 생성합니다.

3. 프로그램 이름을 정하고 기타등등 다 설정하고서 설치할 실행파일 및 컴포넌트를 등록해야 겠죠?

    이거야 머시기 위자드 이용하면 일사천리로 진행되지요.

(여기까지는 누구나 아는거니깐요. 대충 넘어가구요.)

 

[2단계 - 시리얼 넘버를 체크할 DLL파일 만들기]

저는 제일 무난하게 VC++ 6.0 MFC 로 만들었습니다. 여기서 주의할 것은 정적DLL로 만들어야 한다는 겁니다.

안그려면 VC++가 없는 곳에서는 아마 0x80040702 Dll Load Failure 메세지가 뜨면서 설치 중간에 멈춰버릴꺼에욧.

제가 이것땜에 거의 여덟시간을 고생했지요. 이걸 몰라서리.ㅋ

동적DLL로 만들고는 이런 생각을 하실 수 있는데요. "VC++의 depends(Dependency Walker죠)로 시리얼

체크하는 dll에 연관되는 모든 Dll 긁어 모은 다음에 인스톨쉴드의 왼쪽창에 Behavior and Logic에서

Support Files / BillBoard의 Language Independent(이건 오른쪽창)에 다가 파일 다 땡겨오면 되지 않누?

그리고 왼쪽창의 Additional Tools에서 Dependency scanner로 정적/동적 의존파일 불러모으면 되지 않누?"

라구요...제가 실력이 안되서리 다 해봤는데 소용 없더군여. 머..."난 할 수 있다네~~"라고 하시면야 할 말이 없지만요.ㅋ

어쨌든 이렇게 dll 파일을 만듭니다. 만드는 과정은 이렇습니다.(지금부턴 VC++에용.)

 

0. 새 프로젝트를 하나 만듭니다.물론 MFC AppWizard(dll)로 하셔야겠죠.

1. 이때 AppWizard의 Step 1 of 1에서 제일 윗부분의 Regular Dll with MFC statically linked를 선택합니다. 딴건 냅둬용.

    그럼 프로젝트가 하나 생성 되겠죠? 이걸 Ctrl+F5로 릴리즈 컴파일링을 하면 인제 아무때나 쓸 수 있는 dll이 되지요.

    이제 Dll의 내용을 볼까요? 프로젝트 이름을 [SerialManSe]라고 하죠. 시리얼만세입니다.ㅎㅎ

2. 헤더파일을 보죠. variables declaration을 해야겠죠? 예. 변수 선언요. protected와 public private을 적절히 써서

    시리얼 계산에 필요한 각종 변수를 만듭니다. 이건 자유에용. 다만 제대로 돌아가게 만드시길.ㅋ

3. 다음 헤더에서 클래스 선언부가 끝나고 바로 밑부분에다가 이렇게 떡하니 써줍니다.

 

extern "C"  __declspec(dllexport) int CheckSerial(char* charSerialNumber);  //이 dll파일만 있다면 체크할 수 있다. 아싸~~~필요하면 갖다 쓰3.

 

물론 머...CheckSerial만이 아니라 SerialCheck도 되구요. 머...원한다면 SerialManSe(시리얼만세)도 되구...자윱니다.ㅋ

중요한건 cdecl과 stdcall이 없다는 거죠. 간혹 쓰시는 분이 계신데, 머 이걸쓰면 어찌될지는 안써봐서 잘 모르겠습니다.ㅎㅎ

여기서 한가지 더~!! Alt+F7눌러서요(Project Setting이죠), c/c++에서요. category를 general이 아니라 code generation으로

보세요. 그럼 calling convention란을 보면 cdecl이라고 되있습니다. 어떤분이 이걸 확인하라는데, 뭔말인지는 잘 모르겠습니다.

어쨌든 처음에 프로젝트 생성하고 안건드렸는데, 전 cdecl이라고 되있어서 그냥 넘어갔지요.

 

4. 인제 대망의 구현부분입니다.ㅋ 이거 ...머 자유죠. 다음과 같이 함수명을 써주고 그 다음부턴 자윱니다.(자유...참 좋죠.)

    아주아주아주아주아주 간단하게 함수를 구현하면 다음과 같이 합니다. 필요하면 갖다 쓰세요.

 

CSerialManSeApp theApp;    //시리얼만세 프로젝트 App인스턴스죠. 아래 함수가 클래스 메소드가 아닌관계로 꼭 선언해줘야 합니다.

 

//char* charSerialNumber 여기 이 파라미터로 시리얼이 날라오죠. 간혹 컴터가 느리면 기어올 수도 있으니 조심하세욧.^^

extern "C" __declspec(dllexport) int SerialManSe_CheckCheckCheck(char* charSerialNumber)

{

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    

   CString serialString; //시리얼 번호를 저장할 부분

    serialString.Format("%s", charSerialNumber);    //시리얼을 char에서 스트링으로 변환합니다.

    

    theApp.SetSerial(atol((LPSTR)(LPCTSTR)serialString));     //이게 머야?하고 물음표가 머릿속에 그려지는 분들은 아래 주석을 보세요.

 

    //theApp. -> 클래스 인스턴스죠.이거 없으면 안되요. 머 간혹 '나 필요 엄떠~'하는 분들이 계시죠.ㅋ

    //SetSerial(); -> 이건 여기 공개 안했는데, 클래스의 protected변 수인 CString serial에 저장하는 Accessor함수입니다.

    //다음 SetSerial에 파라미터로 전달되는 atol() -> 글자로 입력된 것을 숫자로 바꿔주는 함숩니다.

    //(LPSTR)(LPCTSTR)serialString -> ㅎㅎ몰라도 되죠.ㅋ 알고싶으시면 empas 모여라 검색에서 검색해보세요.ㅎㅎ

    

    if(theApp.IsThatRight(theApp.GetSerial()))    //IsThatRight ->시리얼이 맞니? 하고 물어보는 함수죠. 이 dll의 실질적인 핵심입니다.

                                                                   //맞으면 0, 틀리면 1을 반환합니다.

    {

        return true;            //맞으면 0을 반환하죠. 이 리턴은 누가 받느냐? 누구긴 누구겠어요. 인스톨 쉴드에서 받지요.

    }

    else

    {

        return false;        //그럼 여기서 문제. 이 리턴은 누가 받을까요?...............예.. 맞습니다. 천재시군요.ㅋ

    }

}

이렇게 함수를 구현해줍니다. 물론 여기 이 함수 내에서 필요한 작업을 다 마쳐도 좋겠지요. 하지만 나 C++좀 배웠소~하고

뽐좀 내야죠.ㅎㅎ. IsThatRight함수로 시리얼을 체크하는 부분은 여러분이 알아서 만드시길 바랍니다.

머...123456789이렇게 아홉자리 입력해서 각 자리 다 더하면 45가 나오게 하는 걸 할 수도 있겠죠?

아님 999990000으로 해도 45가 나오니..근데 이건 금방 알겠죠?ㅋㅋ

4. 자~~드디어 dll함수를 다 만들었습니다. 그럼 컴파일 해야죠. Ctrl+F5로 릴리즈 컴파일링합니다.

    혹, dll이 크기가 굉장히 작은 kb대의 용량을 보이면 아까 프로젝트 생성할 때, 동적dll로 실수로 만든게 아닌가 의심해보셔야 합니다.

    아주 간단하게 구현해도 1.25MB가 나옵니다. ㅋ 디컴파일해서 시리얼생성원리 들킬만한 만만한 용량은 아니죠?

5. 그럼 이걸 쓸까요? 아니죠..시리얼 텍스트 파일을 만들어야죠. 자기가 만든 프로그램 자기가 시리얼 모른다면 이거 세상에 누가 씁니까?

    그런의미에서 VC++를 또 켭니다. 프로젝트 하나 생성하시구요. 이번엔 txt파일로 출력하는 과정을 구현합니다.

    예를 들어 10자리수라하면 0000000000부터 9999999999까지니까 총 99억개(맞나?)의 시리얼 범위가 생성되겠죠?

    이것을 for(i=0 ; i<999999999 ; i++)로 돌려서 dll로부터 리턴이 true인 경우만 따로 기록해서 txt의 끝부분에 \n하고 저장하시면

    나중에 보기좋게 올바른 시리얼만 쭉~~나오게 되지요.(아이구 이뻐라~) 물론 시간좀 걸립니다.

    저는 아주 그냥 간단하게 숫자로만 했는데요. 필요하시다면 문자 및 특수문자, 유니코드와 8, 16진수, 비트연산자를 동원해서

    시리얼을 검증하는 방법도 있습니다. 머...하자면 할수 있겠지만, 누가 인터넷에 이것이 이 플그램의 씨리얼이오~하고 내놓으면

    고생해서 만든게 물거품이 되니까요. 너무 많은 노력을 기울이시는건 배보다 배꼽이 더큰 상황이 되겠죠. 머......자윱니다.ㅋ

그럼 이걸로 dll을 만들고 dll로부터 txt파일로 시리얼도 추출했습니다.다음은 이 dll을 인스톨쉴드에 쑤셔 넣어야 겠죠?

 

[3단계 - 시리얼 넘버 체크할 과정 만들기]

자~ 환경은 갖춰줬으니 인제부턴 참으로 재미있고, 짜증나는 스크립드놀이를 시작해야죠. 별거 없습니다. 머 따라하세요.

0. Behavior and Logic에서 InstallScript를 두번 클릭합니다. 그럼 오른쪽에 창이 두개가 뜨죠. 근데 가운데것은 별볼일 없구요.

    오른쪽이 중요합니다.

1.  function OnFirstUIBefore() 라고 되있는 부분을 찾습니다.

    그리고는 Dlg_SdWelcome:, Dlg_SdLisence:..머 이렇게 Dlg로 시작하는 '나 대화상자요~'하고 내놓고 버티고 있는 구문들을 볼수있는데요. c/c++에서 Switch문 안쪽의 그...머냐...그....거시기라고 보시면 됩니다. case serialmanse...이런거 말이죠.

    어쨌든 Event_Driven처럼 이벤트에 따라 동작하는것 같은데요. 위에서부터 차례대로는 아니구요. goto문에 따라 분기가 됩니다.

    보통은 Dlg_SdWelcome:부터 시작하지요.

    그럼 여기서 순서를 정해볼까요? "환영메세지"->"시리얼 체크하기"->"라이센스 보기"->"프로그램 경로지정" 제일 무난하죠?

    이 순서는 Dlg_SdWelcome:   ->  Dlg_SdRegisterUserEx:   ->   Dlg_SdLicense:   ->   Dlg_SdAskDestPath: 되겠죠.

제일 처음에 프로젝트를 생성하면  Dlg_SdRegisterUserEx:가 없지요.머...'나 있어~'하시면 웃지요.

어쨌든 전 없었는데요. 이렇게 코딩을 해줬습니다.

 

//function OnFirstUIBefore() 위에다가 아래와 같이 선언해줘야 합니다. 안하면 안되용.

 

prototype cdecl INT SerialManSe.SerialManSe_CheckCheckCheck(BYREF STRING);    //뒤에 함수명은 dll의 그것과 같아야죠.

 

//아래는 function OnFirstUIBefore() 의 저 깊숙한 곳에 씁니다.

 

Dlg_SdRegisterUserEx:///////////////////////////////////////////////////////////////////

    szMsg   = "";

    szTitle = "";                  

    svSerial = "";    //필요한 변수는 함수 첫부분 (begin이전에)에서 필요한만큼 선언합니다.

       

    szDLLName = SUPPORTDIR^"SerialManSe.dll";

 

    //참고...이전에 UseDLL에 szDLLName로 간접적으로 집어넣지 않고 SUPPORTDIR^"SerialManSe.dll"를 파라미터로

    //직접전해줬는데, 에러나더군요. 그래서 #define이나 이렇게 변수로 전달해줍니다.

 

    bResult = UseDLL(szDLLName);    //이거 아주 중요하죠. 아까 만든 dll을 불러오는 함숩니다.

    SdRegisterUserEx(szTitle, szMsg, svName, svCompany, svSerial);

    //맨 마지막 파라미터가 중요하죠. 여기에 사용자가 입력한 시리얼(*로 표시되는)이 들어오죠. 이걸 dll의 함수로 넘기는 겁니다.

                        

    if(bResult = 0)  then   //올바른 로딩이 되었음을 의미하죠. 로딩 안되면 말짱 꽝이니 예외처리를 해주셔야 합니다.

                                    //이거 안해주면 0x80040702에러 날 수도 있습니다.(가~끔요)

        bRet = SerialManSe_CheckCheckCheck(svSerial);    //이거 핵심이죠. 시리얼 체크하는 겁니다. 파라미터...아까 강조했던 그놈이죠.

        //리턴받았죠. 그럼 리턴값을 평가해야겠죠?

        if(bRet = TRUE)  then    //평가해줍니다. '그값이 알고보니 맞을것 같기도 하삼~'하고 리턴들어오면 다름 파트인 라이센스로 옮겨야지요.

            UnUseDLL( szDLLName );    //옮기기전에 dll '안사용'해주고요.ㅋ

            goto Dlg_SdLisence;        //라이센스로 옮깁니다.

        else    //리턴이 틀렸다네요.

            MessageBox("혼날래? 제대루 써~! 언능!!!", INFORMATION );    //사용자를 압박하는 한마디..ㅎㅎ

            UnUseDLL( szDLLName );

            goto Dlg_SdRegisterUserEx;    //키 입력받는 곳으로 돌아갑니다.

        endif;

    else    //어이쿠 라이브러리가 없다네요. 이런 불쌍사는 없어야죠. 근데, 동적dll로 dll만드심 이 메세지 뜹니다.

        MessageBox("어쩌라고~? 하늘을 봐야 별을 따지.", WARNING);

        UnUseDLL( szDLLName );

        abort;          

    endif;                     

             

    if (nResult = BACK) goto Dlg_SdWelcome;

 

-----------------------------------

자~~인데 스크립트도 다됐습니다. 간혹 왼쪽창의 User Interface에서 Dialog를 만지는 분이 계신데요.

위치바꾸고. 크기 조정하는데는 필요해도 시리얼 체크하는것과는 별 관련이 없답니다.

 

2.  다음...dll을 프로젝트로 가져와야겠지요? Behavior and Logic에서 SupportFile / Billboard를 클릭합니다.

    그럼 별볼일 없는 오른쪽창과 쪼금 볼일있는 가운데 창이 나타나지요. 이 트리 가운데서 맨 위에 Language Independent를

    클릭합니다. 그럼 맨 오른쪽 창애 별볼일이 생깁니다. 마치 파일 탐색기 같지요?

    오른쪽 버튼으로 Insert파일 을 눌러서 아까 만든 dll파일을 가져옵니다.(그럼 그 용량만큼 셋업파일 규모가 커져용.)

 

 

----끝~~~----------

끝났습니다. 인제 빌드 하면 됩니다. 머 dependency scanner로 쭉 불러와주는거 참 좋고요. 인제 맘놓고 빌드하시기 바랍니다.

 

머...초보자가 이때까지 고생고생하면서 시리얼 체크부분 만들었던거 두서없이 썼는데요. 중 및 고수분들은 부디 보지 마시고,

초짜분들은 저와같이 고생하지 마시라는 의미해서 이렇게 썼씁니다.

좋은 하루 되시구요. 감사합니다~~~

    

[코멘트] 좋음
2006-05-26 14:57
 kky5766  kky5766님께 메시지 보내기kky5766님을 내 주소록에 추가합니다.kky5766님의 개인게시판 가기 
좋은 글 감사합니다!
저장 취소
[코멘트] 좋음
2008-06-24 09:30
 ljhhjw  ljhhjw님께 메시지 보내기ljhhjw님을 내 주소록에 추가합니다.ljhhjw님의 개인게시판 가기 
감사합니다... 찾던 내용인뎅..
저장 취소
코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.