Thinking Different





소개

 비주얼 스튜디오 설치 (VSI) 프로젝트의 사용자 인터페이스 중에서 고객 정보 대화 상자를 추가 할 수 있습니다.  이 대화 상자는 일련 번호 입력 필드(라이선스 넘버 입력 항목)를 가지고 있습니다.  하지만 이 필드 부분에 대한 라이선스 유효성 검사 알고리즘은 ('%' 로 입력된 숫자에 대해서만 간단히 합을 구하여 7로 나눈 나머지가 0이면 통과되는 알고리즘) 간단히 유효성 검사를 진행하는것 밖에는 되지않으므로, 세부적으로 알고리즘을 갖는 유효성 검사로직을 작성하기 위해서는 외부 DLL 프로젝트를 만들어서 msi 프로젝트에 병합(merge)을 해줘야 합니다.


이 장에서는 유효성검사 로직을 외부 DLL 프로젝트로 따로 작성하여 VSI 설치 프로젝트에서 사용자 지정 유효성 검사를 수행하는 데 필요한 단계를 제공합니다.


VSI 설치 프로젝트 생성하기

일련번호 유효성 검사 알고리즘 테스트만 하도록 최대한 심플하게 진행하겠습니다. Visual studio 2013에서 VSI 프로젝트를 생성하고 이름을 'SetupDemo' 로 지정합니다.




고객 정보 대화 상자 만들기

솔루션 탐색기 패널 클릭 사용자 인터페이스 편집기 버튼을합니다.


사용자 인터페이스 탭으로 이동하여 'Start' 노드를 선택하고 오른쪽 메뉴에서 '대화 상자 추가'를 선택합니다. 그리고 '고객정보'를 추가하고 아래와 같이 대화상자 순서를 변경합니다.



'고객 정보' 대화 상자를 선택하고, 속성 패널에서  ShowSerialNumber를 True로 설정합니다.



SerialNumberTemplate 속성

대상 컴퓨터에 설치하는 동안 고객 정보 대화 상자에서 일련 번호 항목을 확인할 때 사용하는 템플릿을 지정합니다.

SerialNumberTemplate 속성은 텍스트 상자가 대화 상자에 표시되는 방법을 결정하고 일련 번호의 형식만 확인할지 또는 Windows Installer 알고리즘에 따라 일련 번호를 확인할지 여부를 결정합니다.

예를 들어, SerialNumberTemplate 속성을 "<### - %%%%>"로 설정하면 공백으로 둘러싸인 대시로 구분된 두 개의 텍스트 상자가 만들어집니다. 첫 번째 상자(###)에 대한 유효성 검사에서는 사용자가 세 자리 숫자를 입력했는지만 확인합니다. 두 번째 상자(%%%%)에 대해서는 숫자를 더한 합계를 7로 나누는 알고리즘을 사용하여 유효성이 검사됩니다. 이때 나머지가 0이면 유효성 검사에 통과하고, 그렇지 않으면 실패합니다.

편집 가능한 문자는 고객 정보 대화 상자의 텍스트 상자 내에서 자리 표시자로 표시되고 다른 문자는 텍스트 상자 사이에서 레이블로 표시됩니다.

SerialNumberTemplate 속성에 대해 유효한 편집 가능한 문자는 다음과 같습니다.


 문자

의미 

 # 

 유효성 검사 알고리즘에 포함되지 않을 숫자가 필요합니다.

 %

 유효성 검사 알고리즘에 포함되지 않을 숫자가 필요합니다.

 ?

 유효성 검사 알고리즘에 포함되지 않을 영숫자가 필요합니다.

 ^

 대문자나 소문자가 필요합니다. 여기에는 숫자를 사용할 수 없습니다.

 <

 이 문자의 왼쪽에 있는 모든 문자는 대화 상자에 표시되지 않습니다.

 >

 이 문자의 오른쪽에 있는 모든 문자는 대화 상자에 표시되지 않습니다. < 문자를 사용한 경우에는 이 문자를 종결자로 사용해야 합니다.


ShowSerialNumber 속성이 true로 설정되어 있으면 사용자가 다음 설치 단계로 이동하기 전에 SerialNumberTemplate 속성에 지정된 템플릿으로 일련 번호의 유효성이 검사됩니다. ShowSerialNumber 속성이 false로 설정되어 있으면 SerialNumberTemplate 속성이 적용되지 않습니다.


출처 : https://msdn.microsoft.com/ko-kr/library/w3xwh311(VS.80).aspx

이제 설치 프로젝트를 빌드하고 닫습니다.


일련번호 유효성 검증 외부라이브러리 작성 

위 VSI 프로젝트에서 SetupDemo.msi가 만들어졌으면, 다음은 일련번호의 유효성 검증 코드를 dll로 작성하여 병합하는 일만 남았습니다.

msi의 프로젝트 라이브러리는 msi.lib 라이브러리를 통해서 Windows Installer 세션의 핸들을 전달 유형 MSIHandle의 매개 변수를 사용하여 Windows Installer 런타임과 상호 작용할 수 있습니다.


C에서 검증 라이브러리를 작성 ++

Visual Studio 2013에서 새로운 Win32 프로젝트로 'CheckPIDDll' 이름으로 하는 DLL 프로젝트를 만듭니다.




간단히 일련번호를 검증하는 소스를 아래와 같이 구성하여 적용합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// CheckPIDDll.cpp : DLL 응용 프로그램을 위해 내보낸 함수를 정의합니다.
//

#include "stdafx.h"
#include <msi.h>
#include <msiquery.h>
#include <tchar.h>
 
#pragma comment(lib, "msi")
 
UINT __stdcall VerifyPID(MSIHANDLE hInstall)
{
    // Local variables
    TCHAR szPidKey[MAX_PATH] = { 0, };
    DWORD dwBuffer = sizeof(szPidKey) / sizeof(TCHAR);
 
    // Get the PIDKEY property
    if (ERROR_SUCCESS != MsiGetProperty(hInstall, TEXT("PIDKEY"), szPidKey, &dwBuffer))
    {
        MessageBox(NULL, _T("PIDKEY"), _T("Not able to retrieve PIDKEY property"), 
            MB_OK | MB_ICONEXCLAMATION);
        return 0;
    }
 
    // do something ...
    // pid key check alghrithm ...
    // .......
 
    //If PIDKEY passes check (simple example)
    if (lstrcmp(szPidKey, _T("123-4567890")) == 0)
    {
        MsiSetProperty(hInstall, _T("PIDCHECK"), _T("TRUE"));//PIDKEY passes check
    }
    else
    {
        //PIDKEY doesn't pass check
        MsiSetProperty(hInstall, _T("PIDCHECK"), _T("FALSE"));
        MessageBox(NULL, _T("serial number is not valid."), _T("Installer"), 
            MB_OK | MB_ICONINFORMATION);
    }
 
    return 0;
}



외부에서 위 함수를 사용할 수 있게 하기 위해서 모듈정의파일(.def)를 생성하고 이름은 CheckPIDDll.def로 지정합니다.




아래와 같이 코드를 수정합니다.


LIBRARY "CheckPIDDll" EXPORTS VerifyPID

빌드를 진행하여 CheckPIDDll.dll 파일을 생성합니다.

빌드 출력 파일 CheckPIDDll.dll 를 이제 설치 프로젝트에 사용할 모든 준비가 끝났습니다.



Orca 도구  

Orca는 Windows Installer 패키지를 구성하는 데이터베이스 테이블에 대한 전체 액세스 권한을 제공하도록 설계된 Windows Installer 패키지 편집기입니다.  

Visual Studio 설치시에 Windows Installer SDK의 일부로 제공되며, 설치파일만 제공하고 자동설치를 하지는 않으므로 visual studio 설치 폴더 내에 orca.msi 를 검색하여 설치하셔야 합니다.

Orca에 대한 세부적인 기능들은 여기서는 다루지 않도록 하겠습니다.

필자가 설치된 orca.msi 경로는 다음과 같습니다. 


visual studio 2013 ultmate kor 기준 :

C:\Program Files (x86)\Windows Kits\8.0\bin\x86\Orca-x86_en-us.msi


MSI 패키지를 편집하고 검증 라이브러리 추가하기

1. Orca 를 열어서 'SetupDemo.msi'  패키지를 엽니다. 


2. 왼쪽 Tables에서 'Binary' 테이블을 선택하고 오른쪽 메뉴 새 행 (또는 Ctrl + R) Name에는 CheckPIDDll Data 항목에는 CheckPIDDll.dll을 찾아서 설정합니다.




3. 'CustomAction' 테이블을 열어 새로운 행을 추가(Ctrl+R) 하고 아래와 같이 값을 넣어줍니다.


Action : CheckSerial

Type : 1

Source : CheckPIDDll

Target : VerifyPID




4. 'Property' 테이블을 열어 새로운 행을 추가(Ctrl+R) 하고 아래와 같이 값을 넣어줍니다.


Property : PIDCHECK

Value : FALSE




5. 'ControlEvent' 테이블을 열어 아래 설명과 같이 2가지 변경을 진행합니다.


아래 변경전 그림과 같은 항목을 검색하여 변경 후 그림과 같이 항목을 변경합니다.


변경 전


변경 후




아래 변경 전 그림과 같은 항목을 검색하여 Condition 항목을 변경 후 그림과 같이 ((PIDCHECK = "TRUE") AND CustomerInfoForm_NextArgs <> "" AND CustomerInfoForm_ShowSerial <> "") 으로 변경합니다.


변경전


변경후



모두 변경한 뒤의 모습


이제 모든 변경 사항을 저장하고 Orca를 종료한 뒤, 설치 데모 SetupDemo.msi 를 실행하여 일련번호 유효성 검증 라이브러리를 테스트해봅니다.




위와 같이 잘 작동되는것을 확인할 수 있습니다.


참조   

https://msdn.microsoft.com/ko-kr/library/w3xwh311(VS.80).aspx

http://support2.microsoft.com/default.aspx?scid=kb;en-us;Q253683

http://www.codeproject.com/Articles/571399/Building-installation-project-with-serial-number-v