Встраивание одной программы в другую
От: galex1981 Россия  
Дата: 06.07.10 13:52
Оценка:
Здравствуйте всем!
Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.

Идея такова: В головной программе передаю дескриптор рамки (HWND) параметром в дочернюю программу. Пример ниже:

    CString tmpStr;
    tmpStr.Format(" -p %d", m_frame.m_hWnd);//Дескриптор рамки
    SHELLEXECUTEINFO SHExecInfo;
    ZeroMemory(&SHExecInfo, sizeof(SHExecInfo));

    SHExecInfo.cbSize = sizeof(SHExecInfo);
    SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    SHExecInfo.nShow = SW_SHOWNORMAL;
    SHExecInfo.lpFile = "1\\childapp.exe";//Дочерняя программа
    SHExecInfo.hwnd = this->GetSafeHwnd();
    SHExecInfo.lpParameters = tmpStr;

    if(!ShellExecuteEx(&SHExecInfo)) {
    // обработка ошибок
    }


В дочерней программе в InitInstance создаю родительское окно с полученным дескриптором и создаю окно-потомок от него. Приложение создано как диалоговое окно, то есть до переделки было модальное окно.
Проблема состоит в том что при вызове из головной программы дочерней окно появляется и сразу исчезает...
Код функции InitInstance привожу ниже:

BOOL CChildAppApp::InitInstance()
{
    HWND m_newHWND = NULL;
    CCommandLine pCmd;
    CString strFlag = _T("");
    CString strParam = _T("");
    BOOL bRet = pCmd.GetFirstParameter(strFlag, strParam);
    while(bRet)
    {
        bRet = pCmd.GetNextParameter(strFlag, strParam);
        if(strFlag==_T("p"))m_newHWND = (HWND)_tstoi(strParam);
    }
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();

    AfxEnableControlContainer();

    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
        //Мой код
    CWnd wnd;
    if(m_newHWND)wnd.Attach(m_newHWND);
    CChildAppDlg dlg;
    m_pMainWnd = &dlg;
    if(!m_newHWND)
    {
        INT_PTR nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
            // TODO: Place code here to handle when the dialog is
            //  dismissed with OK
        }
        else if (nResponse == IDCANCEL)
        {
            // TODO: Place code here to handle when the dialog is
            //  dismissed with Cancel
        }
        return FALSE;
    }
    else {
        dlg.Create(CChildAppDlg::IDD,&wnd);
        m_pMainWnd = &dlg;
        dlg.ShowWindow(SW_SHOW);
        dlg.UpdateWindow();
    }

    // Since the dialog has been closed, return FALSE so that we exit the
    //  application, rather than start the application's message pump.
    return TRUE;
}



07.07.10 11:42: Перенесено из 'C/C++'
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.