C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[20555] 도스모드(?)는 아니죠.
김백일 [cedar] 1460 읽음    2002-07-31 12:26
위경섭 님이 쓰신 글 :
: 설명이 좀 애매하더라도 이해해 주시길..
:
: 도스모드에서 인자에 따라 도스모드나 윈도우모드로 동작하게 할려고 합니다..
: 어떤글에 보니까 stub를 이용하는 방법이 있긴한데...
: 그건 도스모드와 윈도우모드가 완전히 별개라서 힘들구요...
:
: 예를들면...볼랜드 소켓서버 같이 만들고 싶습니다..
:
: 즉
: scktsrvr -install 하면 서비스 등록만 해주고 빠져나오고..
: scktsrvr 하면 윈도우가 뜨죠..
:
: 이런식으로요...
:
: 설명이 잘 이해 되셨는지 모르겠네요..
: 더 질문할게 있지만 이 문제가 해결되면 또올리겠습니다. ^^;;
:
: 감사 ^^
:

STUB을 써서 도스용 프로그램을 따로 만드는 것과는 별로 관계가 없습니다.
윈도에서는 STUB이 실행이 안되니까요.

이것은 command-line arguments(or parameters)를 어떻게 처리하느냐의 문제입니다.

도스용(콘솔용) 프로그램의 main() 함수의 원형은
int main(int argc, char * argv[])
이므로 argc 와 argv[] 배열로 처리하는 건 알고 계실겁니다.

반면에 윈도 프로그램의 WinMain() 함수의 원형은
WINAPI WinMain(HINSTANCE hCurInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
입니다.

여기서 lpCmdLine 포인터가 가리키는 문자열 상수가 커맨드라인 전체의 문자열입니다.
이것을 적당히 토크나이즈(tokenize)/파싱(parsing)하셔서 처리하시면 됩니다.
또는 API 함수인 GetCommandLine() 함수를 사용하셔도 커맨드라인 전체의 문자열을 얻으실 수 있습니다.

WIN32 API만으로 작성된 프로그램이 아니라 VCL/CLX를 쓰신다면,
lpCmdLine 을 쓰실 수는 없습니다.
대신 전역 포인터 변수인 CmdLine을 쓰면 되죠.
그러나 이 방법보다는
main()의 argc와 argv와 비슷한
ParamCount()와 ParamStr() 함수를 쓰실 것을 권합니다.
ParamStr()은 char 배열이 아니라 AnsiString을 리턴하기 때문에 훨씬 편리하죠.

또한 VCL/CLX는 FindCmdLineSwitch()라는 편리한 함수를 지원합니다.
ParamStr(1), ParamStr(2), ... , ParamStr(ParamCount())가
"-install"과 "/install"과 같은 커맨드라인 스위치인지를 판별하는 함수도 있죠.

하여튼 이와 같은 커맨드라인 파싱 루틴을
WinMain에서 호출하도록 하면 됩니다.

다음과 같은 WinMain()이 있다면
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();

         // 여기서 커맨드라인 파싱 루틴을 호출합니다.
         // 폼을 생성하지 않고 종료하려면
         // 여기서 적당한 처리 루틴을 넣은 뒤
         // Application->Terminate() 등으로 종료해주면 되겠죠.

         Application->CreateForm(__classid(TForm1), &Form1);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
   
    return 0;
}

+ -

관련 글 리스트
20542 [질문] 도스모드 + 윈도우모드 프로그래밍 위경섭 1143 2002/07/30
20555     도스모드(?)는 아니죠. 김백일 1460 2002/07/31
20569         Re:정말 감사합니다..개념이 좀 부족했네요 ^^;; 위경섭 1079 2002/08/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.