본문 바로가기
개발 관련 이야기

[NSIS] 자동실행 시 파라미터 전달

by 꿈틀쓰 2022. 8. 5.

실행 시 무조건 로그인을 해야하는 우리 프로그램을 윈도우 시작할 때 자동으로 실행될 때는 그냥 트레이에만 나타나게 해달라는 요청이 있었다.

 

이럴 때는 NSIS에서 레지스트리에 시작프로그램으로 등록하고 실행될 때 파라미터와 함께 실행되도록 스크립트를 작성한 다음, 프로그램 시작 시 파라미터가 조건을 만족하면 다이얼로그를 생성하지 않도록 하면된다.

 

WriteRegStr으로 다음과 같이 작성하면 된다.

CurrentVersion/Run에 등록하면 시작프로그램에 등록이 되는데 이 때 WriteRegStr의 마지막 파라미터는 해당 실행파일의 위치를 문자열로 전달해주는데 어차피 커맨드창에서 해당 스트링을 복사해서 붙여넣은 후 실행하는 것이나 마찬가지 지이므로 "파일경로 파라미터" 이런 식으로 파일 경로 한 칸 띄고 파라미터(ex: /hide)로 레지스트리에 저장하면 된다.

// 레지스트리 등록
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "String Value" "$INSTDIR\ExecutiveFile.exe parameter"

// 레지스트리 삭제
DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "String Value"

 

이 때 MFC 단에서 해당 프로젝트명으로 생성된 클래스의 변수를 정의한 곳이 있다.

C프로젝트명App theApp;     // 이렇게 정의된 곳

 

그 곳의 InitInstance에서 구분할 토큰(나 같은 경우에는 백슬래시(\))으로 구분하여 두번째 인자를 받아낸다.

토크나이저 사용법은 아래를 참고

https://docs.microsoft.com/en-us/cpp/atl-mfc-shared/reference/cstringt-class?view=vs-2019#tokenize

CString     strCmdLine = GetCommandLine();
CString     exePath, arg1;
int         iStart = 0;

exePath = strCmdLine.Tokenize(_T("토큰"), iStart);
arg1 = strCmdLine.Tokenize(_T("토큰"), iStart);
arg1.Trim(_T(" "));

이제 얻어진 arg1으로 하고 싶은대로 처리하면 된다.

댓글