맨처음 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
와 같이 출력됩니다.
'프로그래밍 팁 > etc' 카테고리의 다른 글
바로가기 복사하기 (0) | 2011.07.26 |
---|---|
OS가 64비트인지 32비트인지 확인하는 방법 (0) | 2011.07.19 |
PE파일의 API확인 명령어[간단] (0) | 2011.07.11 |
폴더 열때 파일 선택 방법 (0) | 2011.07.08 |
파일 시간 가져오기(Create Time, Access Time, Write Time) (0) | 2011.07.07 |