VC나 VB등 다른 개발툴에서는 어떻게 되는지 잘 모르겠지만
(아마 Delphi와 C++빌더와 같을것 같은데...)
VCL(Delphi와 C++빌더)에서는 기본적으로 STARTUPINFO 의 wShowWindow 옵션에 따라 지원하지는 않습니다.
방법1. CreateProcess로 실행되는 윈도우프로그램을 수정할수 있다면?
윈도우 Application에서 직접 STARTUPINFO 를 확인해서 보여주던지 말던지 하면 될것 같습니다.
//Project**.cpp 에서
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
STARTUPINFO si;
GetStartupInfoA(&si); //Startup Info를 가져와서
//mainform을 show하지 않도록 설정
if( si.wShowWindow == SW_HIDE ) Application->ShowMainForm= false;
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
방법2. 실행되는 윈도우프로그램을 수정할수 없다면?
;- CreateProcess로 윈도우 어플리케이션을 실행한후에
- 프로그램이 초기화 될때까지 기다렸다가
- 초기화가 되면 Application의 메인윈도우 핸들을 찾아 ShowWindow(hwnd,false); 해줘야 될듯 합니다.
int __stdcall EmumWindowProc(HWND hWnd,LPARAM lparam)
{
String sClsName;
char buf[256];
GetClassNameA(hWnd,buf,255);
sClsName=buf;
if(sClsName=="TApplication")
{
ShowWindow(hWnd,0);
return 0;
}
return 1;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
STARTUPINFO si ;
PROCESS_INFORMATION pi ;
memset ( &si, 0, sizeof ( STARTUPINFO ) ) ;
si.cb = sizeof ( STARTUPINFO ) ;
si.dwFlags = STARTF_USESTDHANDLES ;
si.wShowWindow = SW_SHOW;//HIDE;
String sFName=ParamStr(0);
bool flag = CreateProcess ( NULL,sFName.c_str(), NULL, NULL, true, 0, NULL, NULL, &si, &pi ) ;
// 실행한 프로그램이 윈도우가 초기화 될때까지 기다림
WaitForInputIdle(pi.hProcess,INFINITE);
// 초기화가 끝나면 Main쓰레드에서 특정 window를 찾아서 hide시킴
EnumThreadWindows(pi.dwThreadId,(WNDENUMPROC)&EmumWindowProc,0);
}
이상입니다.
그럼..
30억 님이 쓰신 글 :
: CreateProcess를 이용해서 다른 프로그램을 실행을 하려고 합니다.
:
: STARTUPINFO si ;
: memset ( &si, 0, sizeof ( STARTUPINFO ) ) ;
: si.cb = sizeof ( STARTUPINFO ) ;
: si.dwFlags = STARTF_USESTDHANDLES ;
: si.wShowWindow = SW_HIDE;
: si.hStdOutput = hwrite ; // 표준출력(stdout) 리다이렉션
: si.hStdError = hwrite ; // 표준에러(stderr) 리다이렉션
: PROCESS_INFORMATION pi ;
: flag = CreateProcess ( NULL, m_batFile.c_str ( ), NULL, NULL, true, 0, NULL, filePath.c_str ( ), &si, &pi ) ;
:
: 그런데 실행할려고 하는 프로그램이 윈도우용 스크립트 실행파일입니다.
: 실행을 하면 파일이 생성이 되서 생성된 파일을 이용하면 됩니다.
: 실행은 잘 되는데 실행 프로그램이 보이면서 실행이 되는데....
: 윈도우용 프로그램도 안보이게 설정해서 실행할 수 있나요?
: 도스는 실행을 했는데 윈도우는 잘 모르겠습니다.
: 고수님들의 조언 부탁드립니다.