맨처음 c 를 배울때 argc, argv 를 배웁니다.

그런데 WinMain() 을 배우면 argc, argv 가 없고, LPTSTR lpCmdLine 하나만 딸랑 나옵니다.

MFC 를 배우면 WinMain() 도 없고, 커맨드 라인은 어디가야 있는지 한참 찾아야 합니다..


그래서 한번 커맨드 라인 관련 사항을 정리해 봤습니다.

1. argc, argv 
: 잘 알고 있을테니까 생략.

2. __argc, __argv 
: WinMain() 으로 시작하는 프로그램은 전역변수로 선언된 이 파라메터를 쓰면 됩니다.

3. __argc, __wargv
: 프로젝트가 유니코드일 경우 __argv 대신 __wargv 를 사용해야 합니다.

4. GetCommandLine()
: main() 으로 시작하는 프로그램과 같은 경우에서 WinMain() 의 lpCmdLine 과 동일한 파라메터를 구하고자 할때 호출합니다.

5. CWinApp::m_lpCmdLine
: MFC 에서는 CWinApp 에 멤버 변수로 커맨드 라인 파라메터가 선언되어 있습니다.

6. CommandLineToArgvW()
: argc, argv 가 좋은점은 파라메터에서 따옴표를 처리해 준다는 겁니다. 파일명이나 문자열이 따옴표로 쌓여 있을때
하나의 문자열로 파싱을 해주기 때문에 매우 편리합니다.
GetCommandLine() 에서는 전체 문자열을 리턴하기 때문에 __wargv 라는게 있는줄 모르던 시절에는 직접 
커맨드 라인을 파싱해서 문자열배열로 바꿔주는 클래스를 만들어서 쓰고는 했었죠.

__wargv 는 사용자가 전달한 문자열을 이미 파싱을 해 놓았기 때문에 커맨드 라인이 아닌 문자열은 직접 파싱을
해야 되는데, 오늘 찾아보니 CommandLineToArgvW() 라는 편리한 함수가 있었네요. 
(이거 없으면 파서다시 직접 만들려고 했는데..)

이름에 떡하니 W 가 붙어있는걸 보시면 아시겠지만 NT 계열만 지원하는 함수입니다. 

다음은 테스트 코드입니다.

Code:
#include <windows.h>
#include <stdio.h>
#include <shellapi.h>

int main()
{
   LPWSTR cmdLine = GetCommandLine();
   int num = 0;
   int i;

   LPWSTR* argv = CommandLineToArgvW(cmdLine, &num);
   if(argv==NULL) return 1;

   for(i=0;i<num;i++)
   {
      wprintf(L"%ws \n", argv[i]);
   }

   LocalFree(argv);

   return 0;
}



커맨드 라인 파라메터로 [aa "bb cc" dd] 를 넘기면

text.exe
aa
bb cc
dd

와 같이 출력됩니다.

Posted by 띠깜
,