将一个EXE程序嵌入MFC运行

原文:http://www.codeproject.com/Articles/18724/Hosting-exe-applications-into-a-dialog

HANDLE hProcess;
HWND apphWnd = NULL;
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    DWORD pID;
    DWORD tpID = GetWindowThreadProcessId(hwnd,&pID);
    if(tpID == (DWORD)lParam)
    {
        apphWnd = hwnd;
        return false;
    }
    return true;
}
 
HANDLE StartProcess(LPCTSTR program, LPCTSTR args)
{
     HANDLE hPro = NULL;
     PROCESS_INFORMATION processInfo;
     STARTUPINFO startupInfo;
     ::ZeroMemory(&startupInfo, sizeof(startupInfo));
     startupInfo.cb = sizeof(startupInfo);
     //设置进程创建时不显示窗口
     startupInfo.dwFlags = /*STARTF_USEPOSITION*/STARTF_USESHOWWINDOW;
     /*startupInfo.dwX = 600;
     startupInfo.dwY = 900;*/
     startupInfo.wShowWindow = SW_HIDE;
     if(::CreateProcess(program, (LPTSTR)args,
                        NULL,  // process security
                        NULL,  // thread security
                        FALSE, // no inheritance
                        0,     // no startup flags
                        NULL,  // no special environment
                        NULL,  // default startup directory
                        &startupInfo,
                        &processInfo))
        {
            //延迟0.5s,等待进程创建成功
            Sleep(500);
            while(true)
            {
                ::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
                if(NULL != apphWnd)
                    break;
            }
            hPro = processInfo.hProcess;
             
        }
     return hPro;
}
 
 
void CExeInsetMFCDlg::OnNew()
{
    if(apphWnd != NULL)
    {
        OnQuit();
    }
 
    CRect rect;
    GetClientRect(&rect);//get our dialog size into rect
 
//  hProcess=StartProcess("C:\\Program Files\\Microsoft Games\\Minesweeper\\MineSweeper.exe","");//Start ms paint
    hProcess=StartProcess("C:\\Users\\Administrator\\Documents\\Visual Studio 2010\\Projects\\AStar\\Debug\\AStar.exe","");//Start ms paint
     
    if(apphWnd!=NULL)//check for window handle
        {
             
            ::SetParent(apphWnd,m_hWnd);//set parent of ms paint to our dialog.
            SetWindowLong(apphWnd, GWL_STYLE, WS_VISIBLE);//eraze title of ms paint window.
            //Positioning ms paint.
            ::MoveWindow(apphWnd, rect.left, rect.top,rect.right, rect.bottom, true);
            //窗口重绘,(因创建exe时,设置为SW_HIDE,导致exe窗口会被父窗口覆盖一部分)
            Invalidate();
            ::UpdateWindow(apphWnd);
            ::ShowWindow(apphWnd,SW_SHOW);
        }
    else
        MessageBox("Cannot find Window");
         
}
 
 
void CExeInsetMFCDlg::OnQuit()
{
    TerminateProcess(hProcess,0);
    apphWnd = NULL;
}

转:http://www.cnblogs.com/Tisty/archive/2008/05/31/1211395.html

STARTUPINFO解读

 

typedef struct _STARTUPINFO {   

DWORD cb;            //包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段.                        

           应用程序必须将cb初始化为sizeof(STARTUPINFO)   

PSTR lpReserved;      //保留。必须初始化为N U L L   

PSTR lpDesktop;    //用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。                      

           如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。                     

           如果lpDesktop是NULL(这是最常见的情况),那么该进程将与当前桌面相关联   

PSTR lpTitle;    //用于设定控制台窗口的名称。如果l p Ti t l e 是N U L L ,则可执行文件的名字将用作窗口名   

DWORD dwX;       //用于设定应用程序窗口在屏幕上应该放置的位置的x 和y 坐标(以像素为单位)。   

DWORD dwY;       只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,                    

          才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角

DWORD dwXSize;  //用于设定应用程序窗口的宽度和长度(以像素为单位)只有dwYsize    

DWORD dwYSize;   当子进程将C W _ U S E D E FA U LT 用作C r e a t e Wi n d o w 的             

          n Wi d t h参数来创建它的第一个重叠窗口时,才使用这些值。                     

          若是创建控制台窗口的应用程序,这些成员将用于指明控制台窗口的宽度   

DWORD dwXCountChars;  //用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位)   

DWORD dwYCountChars;   

DWORD dwFillAttribute;  

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值