강좌에 앞서서 |
|
 |
개발자가 프로그램을 개발해 놓고도 유저에게 배포할때 무척 어려움이 많습니다. 특히 데이터베이스 어플리케이션인 경우 ODBC의 등록과 데이터베이스파일의 등록이 가장 골치가 아픈 부분입니다. 또한 설치화면의 구성등의 문제도 있습니다. 그래서 편리를 제공하고자 파워소프트사에서 파워빌더에 부록으로 인스톨쉴드라는 프로그램을 제공합니다. 그런데 이 인스톨쉴드에 대해 정확한 사용법을 알고 제대로 사용하는 분들이 거의 없습니다. 이 인스톨 쉴드를 이용하면 사용자의 컴퓨터에 데이터베이스가 설치되어 있지 않아도 따로 개발자가 사용 데이터베이스를 ODBC에 등록 시켜주지 않아도 셋업시에 모든것을 자동으로 설치해 줄 수가 있습니다. 사용자의 클릭 한번으로 데이터베이스 세팅까지 끝나는 겁니다. 저도 제가 사용하려고 제공 헬프를 뒤져가며 혼자 연구한 거라 아직 제 기능을 다 알지 못합니다. | |
|
인스톨 쉴드를 시작하자.
|
|
 |
인스톨쉴드 프로그램을 띄웁니다. 다음과 같은 초기화면이 뜹니다.

| |
|
 |
Project Wizard를 클릭하여 새 프로젝트를 생성합니다.

- 항목설명 - Application - 프로그램에 사용할 이름을 결정합니다. Company Name - 제작회사의 이름을 기입합니다. Development Environment - 개발툴의 환경 Application - 프로그램의 종류(데이터베이스, 인터넷, 일반응용프로그램....) Application Version - 프로그램의 버젼 Application Executable - 프로그램의 메인 실행파일을 옆의 버튼을 눌러 선택합니다. 다음 버튼을 클릭합니다.
| |
|
 |
Setup Window 선택화면

셋업시 띄울 윈도우를 선택하는 항목입니다. 각 항목을 선택하고 Preview 버튼을 누르면 미리보기를 할 수가 있습니다. 많이 익숙한 화면들일 것입니다. 자기 프로그램의 셋업에 맞도록 원하는 윈도우를 체크합니다. Choose Destination Location, Select Program Folder는 꼭 선택하도록 합니다. '다음(N)'을 클릭합니다.
| |
|
 |
플랫폼 선택화면

어떠한 운영체제 하에서 사용할 것인지 선택합니다. '다음(N)'을 클릭합니다.
| |
|
 |
언어 선택 화면 (그림생략) 어떤 언어를 사용할 지를 선택합니다. English만 나와있으므로 바로 다음을 선택합니다.
| |
|
 |
Setup Type 선택화면

셋업타입을 선택합니다. 여러가지 셋업방식을 제공하고자 하는 사람은 적당한 항목을 선택합니다. (일반적으로 Compact만 선택)
| |
|
 |
Components 선택화면

사용할 컴포넌트를 선택합니다. 추가하려면 Add를 눌러 새 컴포넌트를 추가하고 필요없는 컴포넌트는 선택해서 삭제합니다. 컴포넌트는 사용할 파일을 용도에 맞게 구분하기 위해 분류를 하는 것인데 파일들이 적을경우는 Program Files 하나만 남기고 다 삭제해도 무방합니다.
| |
|
 |
File Group 선택화면

컴포넌트와 연결하기 위한 파일 그룹을 설정하는 화면입니다. 앞에서 하나의 컴포넌트만 선택했다면 Program Executable Files만 남기고 모두 삭제해도 무방합니다.
| |
|
 |
요약 화면(그림생략) 지금까지 선택한 옵션들을 요약해서 보여줍니다. 확인을 클릭하면 프로젝트를 생성해줍니다. | |
|
프로젝트를 편집하자.
|
|
 |
메인화면

프로젝트가 생성되면 그림8과 같은 메인 화면이 뜹니다. 왼쪽 화면의 밑에 7개의 탭이 있습니다. 하나씩 알아봅시다.
| |
|
 |
File Groups 탭

프로젝트마법사에서 선택한 파일그룹들이 표시됩니다. 트리는 큰 제목과 하위의 'Links'라는 가지로 분류됩니다. 큰 제목들을 클릭하면 오른쪽에 세부창이 뜨게 되는데 세부창의 항목 역시 더블클릭하면 옵션을 지정하는 화면이 뜹니다. shared 항목은 이 파일그룹이 공유될 것인가를 선택하고 Self-Registered는 자동으로 레지스터리에 등록 될지의 여부를 나타냅니다. 더블클릭하여 원하는 항목을 선택하면 되고 특별한 셋업형식을 취하지 않는다면 손을 대지 않아도 됩니다. 아주 중요한 것인데 하위트리에 있는 Links를 클릭하면 오른쪽창에 아무 내용도 없는 새창이 하나 뜹니다. 그 창에서 마우스 오른버튼을 클릭하면 팝업메뉴가 뜨는데 그 중에서 insert File을 선택하여 셋업할 원본 파일들을 삽입시킵니다. 폴더가 필요하다면 New Folder를 선택하여 폴더를 생성하여 그 안에 필요한 파일을 삽입합니다. 각각의 파일그룹에 대해 동일하게 적용합니다. 프로젝트 마법사에서 파일그룹을 하나만 사용했다면 하나의 그룹만 표시될 것이고 이때는 사용할 모든 파일을 다 선택해서 넣습니다.
| |
|
 |
Component 탭

파일그룹과 컴포넌트를 연결하는 탭입니다. 해당 컴포넌트를 선택하고 오른쪽 상세창에서 제일 밑에 있는 include File Groups를 더블 클릭합니다. 그러면 Property창이 뜨는데 거기서 Add버튼을 눌러 지정된 파일그룹 중 연결할 파일그룹을 선택합니다. 각각의 항목에 맞게 동일하게 적용합니다.
| |
|
 |
Setup Style 탭

선택한 셋업타입이 표시됩니다. 인스톨시 사용자가 선택한 항목에 대해 어떤 컴포넌트를 설치할 것인가를 오른쪽 상세창에서 체크해줍니다.
| |
|
 |
Resources 탭 (그림생략) 설치화면에 표시되는 메시지들을 편집하는 곳인데 디폴트로 그냥 두어도 무방합니다.
| |
|
 |
Setup Files 탭 (그림생략) 셋업에 사용될 파일들을 편집하는 곳인데 다른 항목은 그냥 두면 되고 Splash Screen의 Language independent 를 클릭하면 오른쪽 상세창에 디폴트로 Setup.bmp라는 파일이 설정되어 있는데 이 그림파일은 인스톨준비 과정중에 표시되는 그림으로 인스톨쉴드사의 내용이 있으므로 이 파일을 삭제하고 준비한 그림파일을 insert 하도록 합니다. | |
|
Script Tab을 편집하자.
|
|
 |
이제부터 설명할 scripts탭이 가장 중요합니다. 여기서 레지스트리 등록의 모든것이 이루어집니다. 이번에는 제가 해본 스크립트를 토대로 예제 식으로 진행합니다. 데이터베이스는 SQL AnyWhere 입니다. 다른 ODBC라도 동일하게 적용할수 있습니다. 최종목적은 아무것도 없는 사용자의 pc에 데이터베이스드라이브와 데이터베이스파일을 등록 시키는 겁니다.
| |
|
 |
Script 탭 Script 탭을 선택하면 오른쪽 창에 스크립트편집창이 뜨게되고 이미 많은 내용이 작성되어 있는 것을 알수 있습니다. 이는 우리가 프로젝트 마법사를 거치며 선택했던 내용들이 자동으로 스크립트로 작성되어 있는 것입니다. 그러므로 이 스크립트를 수정하고 삽입하므로써 원하는 기능을 추가할 수 있습니다.
| |
|
 |
전역변수를 하나 선언합니다.
// ----- global variables ------ // generated BOOL bWinNT, bIsShellExplorer, bInstallAborted, bIs32BitSetup; STRING svDir; STRING svName, svCompany, svSerial; STRING svDefGroup; STRING szAppPath; STRING svSetupType; LIST listStartCopy;
// your global variables string s_where ;
global variables 라고 된 부분을 찾아서 밑에다 string으로 s_where 이라고 선언합니다. 기본적으로 문장의 끝에는 ; 을 찍어 주어야 합니다.
| |
|
 |
데이터베이스와 데이터베이스 파일을 레지스트리에 등록합니다.
스크립트중에 SetupRegistry() 함수가 있는 곳을 찾아 갑니다. 현재는 아무런 스크립트도 없을 것입니다. 아래와 같이 스크립트를 작성합니다.
///////////////////////////////////////////////// // Function: SetupRegistry // // // // Purpose: This function makes the registry entries for this setup. // // // /////////////////////////////////////////
function SetupRegistry() NUMBER nResult; string szKey, szClass; string szKeyRoot, szTitle, szMsg, svLogFile; number nResult1, nResult2; string szNumName, szNumValue, svNumValue; number nType, nSize, nvSize;
begin
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); //루트지정
szKey = "Software\\ODBC\\ODBCINST.INI\\ODBC Drivers"; szClass = "SQL Anywhere 5.0"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING,"Installed", -1); //데이터베이스 인스톨 정보 추가
szKey = "HKEY_LOCAL_MACHINE\\Software\\ODBC\\ODBCINST.INI\\Sybase SQL Anywhere 5.0"; szClass = "Sybase SQL Anywhere 5.0"; RegDBCreateKeyEx(szKey, szClass); //데이터베이스 폴더생성
szKey = "Software\\ODBC\\ODBCINST.INI\\Sybase SQL Anywhere 5.0"; szClass = "Driver"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING, TARGETDIR ^ "wod50t.dll", -1);
szKey = "Software\\ODBC\\ODBCINST.INI\\Sybase SQL Anywhere 5.0"; szClass = "Setup"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING, TARGETDIR ^ "wod50t.dll", -1); // 데이터베이스정보 키값 입력
szKey = "HKEY_LOCAL_MACHINE\\Software\\ODBC\\ODBCINST.INI\\Sybase SQL Anywhere 5.0 Translator"; szClass = "SQL Anywhere 5.0 Translator"; RegDBCreateKeyEx(szKey, szClass); //Translator폴더생성
szKey = "Software\\ODBC\\ODBCINST.INI\\Sybase SQL Anywhere 5.0 Translator"; szClass = "Driver"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING, TARGETDIR ^ "WTR50T.DLL", -1);
szKey = "Software\\ODBC\\ODBCINST.INI\\Sybase SQL Anywhere 5.0 Translator"; szClass = "Setup"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING, TARGETDIR ^ "wtr50t.dll", -1);
szKey = "Software\\ODBC\\ODBCINST.INI\\Sybase SQL Anywhere 5.0 Translator"; szClass = "Translator"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING, TARGETDIR ^ "wtr50t.dll", -1); // Traslator 폴더에 키값입력
// 사용할 데이터베이스파일 등록시작 RegDBSetDefaultRoot(HKEY_CURRENT_USER); //루트변경
// 아래부터 나오는 db_pro, db_pro.db는 제 경우의 사용한 db파일이므로 // 여러분은 자신의 *.db 파일을 이용해야 합니다. szKey = "HKEY_CURRENT_USER\\SoftWare\\ODBC\\ODBC.INI\\db_pro"; szClass = "db_pro"; RegDBCreateKeyEx(szKey, szClass); //키 폴더 생성
szKey = "SOFTWARE\\ODBC\\ODBC.INI\\db_pro"; szClass = "AutoStop"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING,"Yes", -1);
szClass = "DataBaseFile"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING, TARGETDIR ^ "db_pro.db", -1);
szClass = "DataBaseName"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING,"db_pro", -1);
szClass = "Driver"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING, TARGETDIR ^ "wod50t.dll", -1);
szClass = "PWD"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING,"sql", -1);
szClass = "start"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING,TARGETDIR ^ "dbeng50.exe -d -c512", -1);
szClass = "UID"; RegDBSetKeyValueEx(szKey, szClass,REGDB_STRING,"dba", -1); // 키값 입력
// Data Sources 폴더 입력 준비 szKey = "SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources"; szClass = "db_pro";
RegDBCreateKeyEx(szKey, szClass); //폴더 생성
RegDBSetKeyValueEx(szKey, szClass, REGDB_STRING,"Sybase SQL Anywhere 5.0", -1); // 키값입력
return 0; end;
데이터베이스의 ODBC 드라이브는 레지스트리의 HKEY_LOCAL_MACHINE\\Sofrtware\\ODBC 아래에 있는 ODBC.INI 밑에 등록되어 있습니다. 그러므로 사용자의 레지스트리에 해당 데이터베이스에 대한 키값을 등록시켜주는 것입니다. 데이터베이스파일은 HKEY_CURRENT_USER\\Software\\ODBC\\ODBC.INI에 등록됩니다. 레지스트리의 폴더경로는 '\'가 아닌 '\\' 이므로 주의 바랍니다. 위에 사용한 wod50t.dll 은 SQL AnyWhere 의 ODBC 드라이브 파일입니다. dbeng50.exe 는 데이터베이스 엔진을 구동하기 위한 파일입니다. Access나 기타 데이터베이스인 경우는 데이터베이스가 등록된 개발자 PC의 레지스트리를 열어 위에 해당하는 내용들의 위치와 키값, 해당 드라이브 파일 등이 어떻게 되는지 확인해서 사용자의 PC에도 동일하게 적용되도록 위 스크립트의 키값 등록 부분을 맞게 고쳐야 합니다. 사용된 문법은 크게 어려울 것이 없으므로 몇번 살펴보면 알수 있을 것입니다. 자신의 레지스트리 보는 법은 다 알겠지만 시작버튼의 실행을 클릭하고 regedit 라고 쓰고 실행시킵니다. 이제 데이터베이스 등록은 완료 되었습니다. 다음은 셋업의 옵션을 고쳐보도록 하겠습니다.
| |
|
 |
자신의 프로그램을 시작메뉴와 바탕화면에 등록을 시킵니다.
스크립트중 SetupFolders() 하는 함수가 정의된 곳을 찾아서 다음처럼 스크립트를 작성합니다.
///////////////////////////////////////////////////////////////////////// // Function: SetupFolders // // Purpose: This function creates all the folders and shortcuts for the // setup. This includes program groups and items for Windows 3.1. // /////////////////////////////////////////////////////////////////////////
function SetupFolders()
string szFolderName; STRING szProgramFolder, szItemName, szCommandLine, szWorkingDir, szIconPath; STRING szShortCutKey, szProgram, nValue; NUMBER nIcon, nFlag, rValue;
begin
szFolderName = s_where; CreateProgramFolder(szFolderName); //설치시 경로에 따라 프로그램 폴더 생성 szProgramFolder = FOLDER_PROGRAMS ^ s_where; //아이콘삽입폴더를 시작메뉴의 프로그램방의 설치폴더로설정
szItemName = "Manager2000"; //아이콘의 이름설정 szProgram = TARGETDIR ^ "manager.exe" ; //실행될 파일경로 LongPathToQuote(szProgram, TRUE); //긴파일이름 지원 szCommandLine = szProgram; //실행시킬 명령옵션 szWorkingDir = ""; szIconPath = TARGETDIR ^ "ko.ico"; //사용할 아이콘 경로 지정 nIcon = 0; szShortCutKey = ""; nFlag = REPLACE;
AddFolderIcon(szProgramFolder, szItemName, szCommandLine, szWorkingDir, szIconPath, nIcon, szShortCutKey, nFlag) ; //항목 추가
//바탕화면에 아이콘을 추가할 것인지 여부 확인 if (AskYesNo("바탕화면에 아이콘을 추가하겠습니까?", YES) = YES) then szProgramFolder = FOLDER_DESKTOP ; AddFolderIcon(szProgramFolder, szItemName, szCommandLine, szWorkingDir, szIconPath, nIcon, szShortCutKey, nFlag); endif; return 0; end;
TARGETDIR 에는 설치된 경로가 저장되어 있습니다. FOLDER_DESKTOP 에는 바탕화면의 경로가 저장되어있습니다. (c:\windows\바탕 화면) FOLDER_PROGRAMS 에는 시작메뉴의 프로그램의 경로가 저장되어있습니다. string 의 연결은 ^ 로 사용합니다.
| |
|
 |
셋업윈도우 부가 세팅
셋업시 순서대로 나타나는 윈도우를 조금더 편리하게 구성합니다.
///////////////////////////////////////////////////////////////////////// // Function: DialogShowSdAskDestPath // // // // Purpose: This function asks the user for the destination directory. // // // ////////////////////////////////////////////////////////////////////
function DialogShowSdAskDestPath() NUMBER nResult; STRING szTitle, szMsg;
begin
szTitle = ""; szMsg = ""; svDir = "c:\\manager2000"; nResult = SdAskDestPath( szTitle, szMsg, svDir, 0 ); TARGETDIR = svDir; return nResult; end;
- 파일의 설치경로를 묻는 윈도우에서 svDir 값을 이용해 디폴값을 지정해줄 수 있습니다. - svDir값을 널로 정의하면 c:\program files\어플리케이션네임 방이 디폴트로 나옵니다
/////////////////////////////////////////////////// // Function: DialogShowSdSelectFolder // // // // Purpose: This function displays the standard folder selection dialog. ///////////////////////////////////////////////////
function DialogShowSdSelectFolder() NUMBER nResult; STRING szTitle, szMsg;
begin
if (svDefGroup = "") then svDefGroup = @FOLDER_NAME; endif;
svDefGroup = "Manager2000"; //default설치프로그램명 지정 szTitle = ""; szMsg = ""; nResult = SdSelectFolder( szTitle, szMsg, svDefGroup ); s_where = svDefGroup; //전역변수에 프로그램 그룹 저장 return nResult; end;
- 프로그램명을 묻는 윈도우에서 디폴트로 값을 지정해줄수 있고 이 값을 선언한 전역변수에 넣습니다.
| |
|
 |
Media 탭 (그림생략)
실제 인스톨파일 패키지를 만드는 항목입니다. Media Build Wizard를 클릭합니다. 인스톨 패키지의 배포형식을 선택합니다. (디스켓용, CD용.....) 빌드를 하면 완성됩니다. 이렇게 완성된 패키지는 c:\My Installation\프로젝트네임\Media\disk1 방에 있습니다. 이 파일들을 CD Writer로 굽던지 디스켓에 카피하던지 해서 배포하면 됩니다.
| |
|
 |
참고 : 다음은 SQL AnyWhere 를 사용했을 때 배포시 포함되어야 하는 파일 목록입니다. 1. 파워빌더 필수파일 : pbdwe60.dll, pbodb60.dll, pbodb60.ini, pbvm60.dll (파워빌더 6.0, 6.5 일때이고 5.0과 7.0은 각각 *50.dll, *70.dll 이런 식일 겁니다.) 2. Anywhere 필수파일: dbeng50.exe, dbl50t.dll, dbtl50t.dll, wod50t.dll, wtr50t.dll 3. 그외 : 사용한 각종 아이콘 파일이나 이미지 파일
| |
|
 |
이 강좌에서는 사용하지 않았지만 autoexec.bat, config.sys를 인스톨시 변경하고자 한다면 다음의 함수를 사용하십시오.
bat file 에 path 추가하기 string szKey, szPath, szRefDir; number nPosition;
program
BatchSetFileName("c:\\autoexec.bat");//시스템 bat 파일의 위치 szKey = "PATH"; szPath = "C:\\manager2000"; //추가할 패스 szRefDir = ""; nPosition = BEFORE; //BEFORE 면 현재 Path의 맨앞에 AFTER 면 맨 뒤에 삽입합니다. EzBatchAddPath(szKey, szPath, szRefDir, nPosition);
endprogram
config.sys 에 추가하기 string szKey, szValue, szRefKey, szMsg; number nOptions;
program
ConfigFileLoad ("c:\\config.sys"); //config.sys파일 로드 szKey = "DEVICE"; szValue = "c:\\manager2000\\man.sys";
szRefKey = ""; nOptions = AFTER; ConfigAdd (szKey, szValue, szRefKey, nOptions);
endprogram
위를 실행하면 config.sys에 "device = c:\manager2000\man.sys" 라고 삽입됩니다. | |
|
강좌 후기
|
|
 |
최대한 쉽게 설명하려고 노력했습니다. 스크립트 부분을 빼고는 그리 어렵지 않으니 여러분들이 차근차근 항목들을 살펴보신다면 제가 설명한 것보다 더 많은 기능을 알수 있을겁니다. 그리고 저도 이것저것 눌러가면서 몸으로 배운것이라 잘못설명했거나 맞지 않는 부분이 있을 지도 모르겠습니다. 그렇더라도 이해 해 주시고 잘못된 부분은 저에게 메일을 보내주시면 고치도록 하겠습니다.
자료출처 : 파워빌더 세상 , http://www.sqlca.com/ | |