간만의 포스팅(3년만...)


간만의 NSIS...


퀘스트는 제목과 같았다...

설치 중 취소하면 취소 전 설치 된 파일을 모두 삭제해 주세요.

고난의 시작이었다.


파일을 설치하기 전단계에서의 취소는 어차피 하드에 기록한게 없으니 상관 없다.


문제는 파일을 설치하는 도중에 취소를 할 경우...


파일 설치는 별도의 thread 에서 처리되고 있어서, 파일 설치 중 강제로 페이지를 이동시키거나 해도 파일 설치 thread 는 계속 동작한다.


그러니 main thread 에서 파일을 삭제해도 제대로 지워지지 않는다.


파일 설치 thread 를 제어할 방법이 있으려나해서 nsis 소스까지 까봤으나 없다. 왜!!


google 느님에게 물어보면 복잡스런 코드가 있기는 한데 이건 취소하면 변수 하나에 취소 했다고 체크해두고


파일 설치에서 한 아이템을 설치 할 때마다 해당 변수를 체크해서 중단하거나 한다.


요거 -> http://nsis.sourceforge.net/InstFiles_Cancel_-_Allowing_a_user_to_cancel_installation_during_InstFiles


하지만, 문제는 너무 번거롭기도 하거니와 설치 스크립트를 아래처럼 폴더로 지정한 경우는 사용이 불가하다. Orz...


    File /r ..\src\* # 이 경우 하나의 아이템으로 처리되고 있어 중단할 수 없다.


결국, 3 일간의 삽질 끝에 해결한 방법을 대충 정리하면 아래와 같다.

  • 설치 SECTION에서 가장 먼저 uninstall.exe 파일을 설치한다. ( 원래는 -post 에서 설치된다. )
  • !define MUI_CUSTOMFUNCTION_ABORT "onUserAbort" # 취소 처리를 제어할 수 있도록 등록한다.
  • 전역 변수 하나를 설정하여, 파일 설치 전 취소 처리에서 알 수 있도록 값을 지정해둔다.
  • onUserAbort 함수에서 파일 설치 중에 취소 했음이 확인 되면 uninstall.exe 를 silent 모드로 실행한다.
    예) ExecWait '"cmd.exe" /C start "" "$INSTDIR\uninstall.exe" /S'
  • uninstall.exe 호출시 주의할 점은 nsExec::Exec 를 이용하면 안된다. nsExec::Exec 를 이용하면 파일 손상 에러가 난다. (이유는 모름.)
  • un.onInit 에서 silent 모드인 경우 설치 프로세스를 종료하도록 처리 한다.

Function un.onInit

    ${GetParameters} $R0

    ${If} $R0 == "/S"

        nsExec::Exec 'taskkill /F /IM ${OutFile}'

        Sleep 2000

    ${EndIf}


상세 코드는 귀찮으니.... 나중에 생각나면 정리해서 올려야겠다.

반응형
nsis 에서 바로가기를 생성해주는 CreateShortcut 명령어.
근데 사용하다보니 생성된 바로가기의 "시작 위치" 정보가 이상하게 들어가고 있어 메뉴얼을 봤지만 CreateShortcut 에는 해당 정보 설정이 없다. 해서 우짜저짜 하다가 알게 된 방법. 사실 맞는 방법인지는 모르겠지만, 잘 되니까 뭐 -_-

CreateShortcut 명령 사용 전에  SetOutPath 을 통해 "시작 위치" 로 지정할 폴더를 지정해주면 된다.

사용 예)
반응형
A Sip of Turkish Coffee
A Sip of Turkish Coffee by Kuzeytac (OUT, till 20.08.09-see profile) 저작자 표시비영리변경 금지

(위 짤방은 그냥 Filckr 에서 'heap' 으로 검색하니까 나온 이미지로, 본문과는 전혀 상관 없습니다;;;)

언젠가부터 자꾸 map 처리에서 exception 이 발생하기 시작했습니다...
해당 map 이 상당히 간단하게만 사용되던 부분이라 중첩콜 되는 부분도 없었고, 여러 스레드에서 호출되는 부분도 없었던지라
map 사용 오류라기 보다는 어디선가 다른 코드에서의 메모리 쓰기 오류로 판단만 하고 있었죠...
자주 발생하고 재현하기가 쉬운 문제라면 디버깅이라도 해서 문제 부분을 잡을 수 있겠지만 그런것도 아니었기에 난감한 상황이었습니다.

어찌되었든 해결을 해야 했기에 배열 인덱스 검사 코드 강화, map 사용 코드 다시 확인 등등을 해도 찾기가 쉽지 않더군요..

인터넷에서 검색을 해보니 도움을 받을 수 있는 프로그램들이 있는 것 같았지만 모두 상용 프로그램인지라 쉽사리 사용할 수도 없었습니다.
그러던 중 _heapchk() 에 대한 내용을 봐서 혹시나 하는 마음에 코드에 추가하여 로그를 살펴보기로 했었습니다.

결과는 일단은 성공입니다.

로그에 _heapchk() 오류가 남은 부분을 다시한번 체크해보니, 배열 사용하는 부분이었는데 배열 인덱스 체크하는 부분이 없어서 잘못된 인덱스에 대한 대비가 안되어있는 부분이더군요.

정확한 오류부분을 찝어주지는 않지만, 범위를 좁혀가는 식으로 사용하면 큰 도움이 될 것 같습니다. :)
반응형

'저장고 > C++' 카테고리의 다른 글

std::string 문자열 공백 자르기 함수  (0) 2009.04.28
COptionTree를 vs2003에서 사용하기  (0) 2009.04.10
GoogleTest??  (2) 2008.10.14
랭킹 관련 작업을 하다가 필요해서 찾은 기능으로 특정 테이블의 데이터를 SELECT 할때 원하는 정렬 값으로 순위를 매길 수 있는 기능

SQL2005에서 관련해 추가된 명령어와, 2005 이전버젼에서 사용할 수 있는 쿼리문이 함께 나와있습니다.

근데 보니까.... 양이 많은 데이터에서는 권장하지 않는다고... -_-

반응형

'저장고 > 기타' 카테고리의 다른 글

NSIS CreateShortcut 사용시 시작 위치(Start in) 정보 설정 방법  (1) 2011.09.01
[SQL] NULL + '문자열' = ?  (0) 2009.06.11
[MSSQL] CASE 함수  (0) 2008.05.19
얼마전 SP를 작업해서 협력사에 넘겼는데 정상 작동을 안한다고 해서 몇시간을 헤맨적이 있습니다. 결국 밝혀진 원인은 제목과 같은 NULL + '문자열' 의 결과였는데 이게 MS-SQL 버젼에 따라 결과가 좀 다르게 나오더군요...

두개의 테이블에서 문자열을 하나씩 검색해서 + 연산으로 문자열을 합치는 쿼리문이었는데 앞에 테이블에서 검색된 열 갯수가 0일 때 문제가 된 것이었습니다.

대충 아래 쿼리와 비슷한 쿼리문이었습니다.

제 작업 환경은 MS-SQL2000, 협력사의 테스트 환경은 MS-SQL2005 였는데 2000에서는 앞의 테이블 검색 결과가 없어도 뒤 테이블에서 검색된 데이터가 출력되는 반면에 2005에서는 앞의 테이블 검색수가 0이면 뒤 테이블 검색 결과에 상관없이 무조건 NULL 이더군요. 결국 ISNULL() 을 사용해서 해결은 했습니다.

근데 또 다른 비슷한 경우를 만들어서 테스트를 해보니 NULL 나오는게 정상인듯 싶네요. 앞으로 주의해야겠습니다;;;
반응형

'저장고 > 기타' 카테고리의 다른 글

[SQL] SELECT 할 때 동적으로 순위 매기기  (0) 2009.06.17
[MSSQL] CASE 함수  (0) 2008.05.19
NSIS 임의로 Page 이동하기  (3) 2007.01.19
문자열에서 공백(스페이스, 텝 등)을 제거해주는 함수.
코드가 간결하고 좋다


반응형

'저장고 > C++' 카테고리의 다른 글

_heapchk() 메모리 긁는 문제의 실마리...  (0) 2009.08.01
COptionTree를 vs2003에서 사용하기  (0) 2009.04.10
GoogleTest??  (2) 2008.10.14
COptionTree Codeproject Page Link

위 링크를 가보면 알겠지만 상당히 유용한 라이브러리인 COptionTree
하지만, vs2003에서는 위 링크에서 제공하는 소스를 컴파일 할 경우 여러가지 에러가 나며 컴파일 되지 않습니다.



이를 해결하기 위한 방법입니다.

1. 포함 파일을 열 수 없습니다. '..\src\afximpl.h': No such file or directory

afximpl.h 파일 include 에러가 나는 코드를 찾아가서 아래와 같이 수정합니다.

OptionTreeFontSelSizeCombo.cpp
OptionTreeFontSel.cpp


2. 매개 변수 2을(를) 'HTASK'에서 'DWORD'(으)로 변환할 수 없습니다.

아래 파일들에 선언/사용된 함수의 HTASK 인자형식을 모두 DWORD 로 변경해줍니다.

OptionTreeColorPopUp.h(123): afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
OptionTreeColorPopUp.cpp(1181):void COptionTreeColorPopUp::OnActivateApp(BOOL bActive, HTASK hTask) 
OptionTreeImagePopUp.h(88): afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
OptionTreeImagePopUp.cpp(284):void COptionTreeImagePopUp::OnActivateApp(BOOL bActive, HTASK hTask) 


위의 두가지 수정작업만 해주면 vs2003에서도 COptionTree 를 문제 없이 사용할 수 있습니다. :)
vs2005는 안써봐서 잘 모르겠지만, vs2005에서도 위와 같은 방법으로 사용가능한 것으로 알고 있습니다. :)
반응형

'저장고 > C++' 카테고리의 다른 글

std::string 문자열 공백 자르기 함수  (0) 2009.04.28
GoogleTest??  (2) 2008.10.14
callstack 정보 출력 라이브러리  (0) 2008.09.19
링크 : http://code.google.com/p/googletest/

인터넷 여기저기 돌아다니다가 우연히 발견한건데..
함 써보면 좋을듯.. =ㅅ=)a
뭐.. UnitTest(?) 툴이라는데 함수 테스트하는데 사용하는 놈인듯...
아직은 어떻게 쓰는건지 잘 모르겠고 나중에 함 연구해바야지...

반응형

'저장고 > C++' 카테고리의 다른 글

COptionTree를 vs2003에서 사용하기  (0) 2009.04.10
callstack 정보 출력 라이브러리  (0) 2008.09.19
rand() 범위가 별로 안되는구나....  (5) 2008.08.19
링크 : http://www.codeproject.com/KB/threads/StackWalker.aspx

callstack 정보를 debug 출력창에 보여주는 라이브러리.
사용도 무지 간단하다..

단지, 디버그창에만 보여주는게 아쉬운데... 출력하는 부분을 약간 수정해서
원하는 출력을 얻을 수 있을듯....

주로 크래쉬 날경우 dmp파일을 남겨서 사용하긴 하지만...
dmp 확인이 불가능할 경우를 대비해서 사용하는 것도 괜찮을듯... +_+
반응형

'저장고 > C++' 카테고리의 다른 글

GoogleTest??  (2) 2008.10.14
rand() 범위가 별로 안되는구나....  (5) 2008.08.19
폴더 삭제하기  (0) 2007.12.26
아무 생각 없이 쓰던 rand()...

최대값이 의외로 작구나.. orz

확률 체크하는데 사용는데 계속 이상하다고 해서 확인하고 찾아보니..

rand() 의 최대값은 RAND_MAX (0x7fff) 으로 정의되어있네... orz
반응형

'저장고 > C++' 카테고리의 다른 글

callstack 정보 출력 라이브러리  (0) 2008.09.19
폴더 삭제하기  (0) 2007.12.26
filelength는 표준이 아닌가...  (3) 2007.12.08

+ Recent posts