|
님이 올려주실 글 보구 바루 해보니 잘 되는군요...감사합니다..
김백일 님이 쓰신 글 :
: 위경섭 님이 쓰신 글 :
: : 설명이 좀 애매하더라도 이해해 주시길..
: :
: : 도스모드에서 인자에 따라 도스모드나 윈도우모드로 동작하게 할려고 합니다..
: : 어떤글에 보니까 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;
: }
|