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
[54705] Re:CreateProcess를 이용해서 다른 프로그램을 실행을 하는데 안보이게 실행시킬수 있나요?
장성호 [nasilso] 4002 읽음    2008-09-29 17:35
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 ) ;
:
: 그런데 실행할려고 하는 프로그램이 윈도우용 스크립트 실행파일입니다.
: 실행을 하면 파일이 생성이 되서 생성된 파일을 이용하면 됩니다.
: 실행은 잘 되는데 실행 프로그램이 보이면서 실행이 되는데....
: 윈도우용 프로그램도 안보이게 설정해서 실행할 수 있나요?
: 도스는 실행을 했는데 윈도우는 잘 모르겠습니다.
: 고수님들의 조언 부탁드립니다.

+ -

관련 글 리스트
54704 CreateProcess를 이용해서 다른 프로그램을 실행을 하는데 안보이게 실행시킬수 있나요? 30억 1771 2008/09/29
54705     Re:CreateProcess를 이용해서 다른 프로그램을 실행을 하는데 안보이게 실행시킬수 있나요? 장성호 4002 2008/09/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.