|
위경섭 님이 쓰신 글 :
: 설명이 좀 애매하더라도 이해해 주시길..
:
: 도스모드에서 인자에 따라 도스모드나 윈도우모드로 동작하게 할려고 합니다..
: 어떤글에 보니까 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;
}
|