Visual C++ 2010에서 라이브러리 배포 정책

Central Deployment(중앙배포)

Central deployment means that your Visual C++ DLLs are installed in the System32 directory. To centrally deploy your application, you can use one of the following:

•The VCRedist_architecture.exe command-line tool.

•Merge modules.

VCRedist_architecture.exe installs all libraries for the specific hardware platform. Merge modules, or .msm files, are simplified Windows Installer installation packages.

The main advantage of central deployment is emergency serviceability. If a critical security vulnerability is discovered, Microsoft automatically updates library files that are centrally-deployed.

Local Deployment(지역배포)

Local deployment means that your application’s library files are installed in the application folder. To deploy

실행 순서

NSIS 스크립트는 기본적으로 위에서 아래로 순서대로 실행이 된다지만 약간 헷갈리기도 합니다. 컴파일 타임 명령과 특히 이곳저곳에 섞이는 인스톨러 속성 명령때문이 아닌가 합니다.컴파일 타임 명령

컴파일되면서 그때 그때 실행되면서 실행 인스톨러에는 영향을 미치지 않습니다. 예로 (현재 디렉토리 c:\test\test 이고 압축할 파일은 C:\test\test.exe 일때)

Section -PrePare
!cd ..
File 'test.exe'
SectionEnd

이렇게 하면 컴파일러가 컴파일하면서 디렉토리를 한번 상위 디렉으로 이동해서 test.exe 를 압축합니다.

Section -PrePare

File '..\test.exe'

SectionEnd

과 같은 결과입니다. 사실상 거의 쓸일이 없습니다만… 컴파일 타임 명령은 주로 !define 명령이 사용됩니다.
컴파일 타임 명령은 인스톨 속성 명령과 달리 실행 순서가 되야 실행됩니다.

인스톨러 속성 명령

인스톨러를 초기화합니다. 컴파일러는 인스톨 속성 …

섹션이란…

Sections

섹션이란 앞에서도 언급했듯이 NSIS 설치관리자의 핵심을 이루는 것입니다. NSIS는 반드시 하나 이상의 섹션을 포함해야하며 이 섹션들은 아래와 같은 규칙하에 그 밑의 명령들로 관리됩니다.

 

  • 각 섹션은 0개 이상의 명령을 포함합니다. (하나도 없을 수도 있습니다).
  • 섹션은 설치마법사에 의해 순서대로 실행되며 ComponentText 가 설정되어 있다면 사용자는 각 보이는 섹션을 선택하거나 해제할 수 있습니다.
  • 만약 섹션의 이름이 ‘Uninstall’ 이거나 섹션 이름앞에 ‘un.’ 이라는 접두어를 붙이면 이것은 설치제거때에만 쓰입니다.
Section Commands
AddSize size_kb
설치관리자에게 현재 섹션이 추가로 size_kb 키로바이트 만큼 필요하다고 알려줍니다. 이 명령은 오직 섹션에서만 유효합니다.
Section AddSize 500
SectionEnd

Section

[/o] [([!]|[-])section_name] [section index output]

새로운 섹션을 시작합니다. 만약 섹션이름이 빈공간이거나

NSIS란…

NSIS의 장점
  1. 파일크기가 작다.
  2. 거의대부분의 윈도와 호환된다.
  3. 특수한 압축방식으로 최소한의 오버헤드와 따로 자동압축풀림 기능을 사용할 필요가 없습니다.
  4. 스크립트 방식으로 인스톨러의 모든 동작을 직접 제어할 수 있습니다.
  5. 다국어를 지원합니다.
  6. 인터페이스나 대화상자를 편집할 수 있습니다.
  7. 필요한 기능은 플러그인으로 추가할 수 있습니다.
  8. 웹을 통한 설치, 패치를 지원합니다.
  9. NSIS는 쉽게 하나의 설치마법사에 여러 프로젝트를 통합하거나 라이트, 풀 버전등을 만듭니다.

간단한 NSIS 문법

  1. 주석
    “;”, “#” 이후의 문장은 주석입니다. /* 와 */ 사이의 문장은 주석입니다.
  2. 명령
    명령 (인자) 입니다. 예) File “myfile.exe”
  3. 플러그인
    플러그인 이름::명령 (인자)
  4. 숫자
    10진수(일반적인 수), 16진수(앞에 0x를 붙입니다.), 8진수(앞에 0를 붙입니다.)
  5. 변수
    변수명 앞에 $를 붙입니다.

NSIS Section이란?

NSIS에 있어서 섹션이란

제공되지 않는 다이얼로그 그리는 방법

C:\Program Files\InstallShield 10.5\Samples\Custom Dialog\VC++ 6 Project

 

1.샘플 프로젝트를 적절한 위치에 복사한다.
2.VS에서 프로젝트를 연다.
3.다이얼로그 편집

이때 사용하려는 다이얼로그와 비슷한 다이얼로그를 인스톨쉴드에서 제공한다면 다이얼로그 샘플러에서 찾아본다.

친절하게도 다이얼로그 ID와 그 다이얼로그가 사용하는 스크립트 파일명이 적혀 있다.

이제 비쥬얼 스튜디오에서 C:\Program Files\InstallShield 10.5\Redist 여기에 각 언어별 폴더에서 _isres.dll파일를 리소스로 불러온다. 0409 는 영어, 0412는 한글 – 기타 다른 언어는 MSDN등을 찾아보면 쉽게 찾을 수 있다.

  http://www.autoitscript.com/autoit3/docs/appendix/OSLangCodes.htm
필요한 다이얼로그를 복사, 붙여넣기를 하고 원하는대로 수정한다.


인스톨쉴드가 제공하는 다이얼로그에서 단순히 표기되는것만 바꿀경우엔 ID를 그대로 유지 시키고 전혀 다른 로직으로 동작을 해야 한다면 새로운 ID를 부여하는데 30000번 이상으로 해야 기존 다이얼로그와 겹치지 않는다. 이제

CD-ROM 드라이브 찾기

function OnFirstUIBefore( ) <-- 에 아래 내용을 입력해 보세요.
    STRING svString;
    NUMBER nResult;
    LIST   listID;
begin
    // Create a list to hold the removable drive names.
    listID = ListCreate (STRINGLIST);

    // Get cdrom drives with at least 0 bytes free.
    if (GetValidDrivesList (listID, CDROM_DRIVE, 0) < 0) then
        // Report an error; then terminate.
        MessageBox (MSG_ERR, SEVERE);
        abort;
    else
        // Display the list of removable drives.
        //SdShowInfoList (TITLE, MSG_REMOVABLE, listID);
        // Retrieve the first item in the list (1078).
        nResult = ListGetFirstString (listID, svString);

        MessageBox (svString,INFORMATION);
    endif;
end;

SdShowInfoList (TITLE, MSG_REMOVABLE, listID); 이것을 이용하면 CD-ROM을 모두 찾습니다. 저의 경우 F:, …

ActiveX 컨트롤 배포시 설치 여부 판단용 자바스크립트

function DetectActiveXControl()
{
    try
    {
        var xObj = new ActiveXObject("XControl.X");

        if(xObj)
            Installed = true;
        else
            Installed = false;
    }
    catch(ex)
    {
        Installed = false;
    }

    if(Installed == true)
    {
        alert("ActiveX Control이 설치됫네 *^^*");
    }
    else
    {
        alert("ActiveX Control이 설치되지 않았네 -_-");
        window.location.reload();
    }
}