헬마입니다.

NSIS를 가끔 쓰다 보면 긴 파일이름과 도스 8.3 형식의 짧은 파일이름을 서로 변경해가면 써야할 일이 생깁니다. 그런데 NSIS는 GetFullPathName /SHORT 을 통해 짧은 이름으로 바꾸는 기능은 있지만 짧은 이름을 다시 긴 이름으로 변경해주지는 않습니다.

그래서 이리저리 NSIS 포럼을 뒤지다가 NSIS에 기본 포함된 System 플러그인을 이용해서 윈도 API를 호출하는 방법으로 서로 변환하는 스크립트가 있더군요.

여기 소개합니다.

!macro ShortToLongPathName LongPath
; 매크로 호출 후 $1 값을 읽으면 변환된 경로명을 읽을 수 있음
StrCpy $1 "" ; $1 에 변환된 긴 경로명이 저장됨.
System::Call "Kernel32::GetLongPathNameA(t '${LongPath}', &t .r1, i ${NSIS_MAX_STRLEN}) i .s"
Pop $0
IntCmp $0 ${NSIS_MAX_STRLEN} +2 +2 0 ; 반환된 길이가 $0 에 저장되며 이 값이 ${NSIS_MAX_STRLEN} 값보다 크면 실패
Abort "failed!"
!macroend

!macro LongToShortPathName ShortPath
; 매크로 호출 후 $1 값을 읽으면 변환된 경로명을 읽을 수 있음
StrCpy $1 "" ; $1 에 변환된 짧은 경로명이 저장됨.
System::Call "Kernel32::GetShortPathNameA(t '${ShortPath}', &t .r1, i ${NSIS_MAX_STRLEN}) i .s"
Pop $0
IntCmp $0 ${NSIS_MAX_STRLEN} +2 +2 0 ; 반환된 길이가 $0 에 저장되며 이 값이 ${NSIS_MAX_STRLEN} 값보다 크면 실패
Abort "failed!"
!macroend

제가 코덱팩에 쓸려고 매크로를 이용하게 약간 수정했습니다.

사용방법은..

LongToShortPathName 'c:program files'

이런식으로 호출하고

$1 에 보면 변환된 경로명이 저장되어 있습니다.

즉,

LongToShortPathName 'c:program files'

MessageBox MB_OK $1

이렇게 하면 C:Program Files 경로을 짧은 이름으로 변경해서 $1에 저장하고

$1에 저장된 내용을 표시하는 메시지 박스를 출력합니다.

그럼 이만..

댓글을 달아 주세요