Встраивание одной программы в другую
От: 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++'
Re: Встраивание одной программы в другую
От: kvasya  
Дата: 06.07.10 17:31
Оценка:
Здравствуйте, galex1981, Вы писали:

G>Здравствуйте всем!

G>Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.

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


Не надо так делать))
Re: Встраивание одной программы в другую
От: Vamp Россия  
Дата: 06.07.10 17:51
Оценка: 1 (1)
Воистину, некоторые люди желают странного.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Встраивание одной программы в другую
От: galex1981 Россия  
Дата: 06.07.10 18:28
Оценка:
Здравствуйте, kvasya, Вы писали:

K>Здравствуйте, galex1981, Вы писали:


G>>Здравствуйте всем!

G>>Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.

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


K>Не надо так делать))

А как надо делать?
Re[2]: Встраивание одной программы в другую
От: galex1981 Россия  
Дата: 06.07.10 18:29
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Воистину, некоторые люди желают странного.


Таково задание. Что-нибудь посоветуете?
Re[3]: Встраивание одной программы в другую
От: Ops Россия  
Дата: 07.07.10 00:15
Оценка: 1 (1)
Здравствуйте, galex1981, Вы писали:

G>Таково задание. Что-нибудь посоветуете?


А какое задание? Вы бы озвучили его полностью, а с тем что есть — прелагаю COM-сервер(OLE?) + COM-клиент, раз уж на винапи писать начали.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: Встраивание одной программы в другую
От: galex1981 Россия  
Дата: 07.07.10 03:12
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, galex1981, Вы писали:


G>>Таково задание. Что-нибудь посоветуете?


Ops>А какое задание? Вы бы озвучили его полностью, а с тем что есть — прелагаю COM-сервер(OLE?) + COM-клиент, раз уж на винапи писать начали.


Задание звучит так: Есть 2 самомтоятельных приложения, которые связаны между собой тем, что одно генерирует входные данные для другого. Требуется командная оболочка, которая управляет механизмом генерации данных с одного приложения и пересылом их в другое. Причем объединить первые 2 нельзя по условию, а то я бы так и сделал бы
Re[5]: Встраивание одной программы в другую
От: kvasya  
Дата: 07.07.10 03:35
Оценка:
Здравствуйте, galex1981, Вы писали:

G>Задание звучит так: Есть 2 самомтоятельных приложения, которые связаны между собой тем, что одно генерирует входные данные для другого. Требуется командная оболочка, которая управляет механизмом генерации данных с одного приложения и пересылом их в другое. Причем объединить первые 2 нельзя по условию, а то я бы так и сделал бы


Типовой IPC. По форуму, я думаю можно даже исходники найти.
Именованные каналы, TCP/IP, сообщения Windows. Способов много.

Полагаю, именованные каналы (named pipes) — то, что вам нужно (коль речь зашла об окнах).
Хотя, если gui не догма, я лично предпочел бы unix-way: читать stdin, писать в stdout, ошибки в stderr.
Re[6]: Встраивание одной программы в другую
От: galex1981 Россия  
Дата: 07.07.10 04:37
Оценка:
Здравствуйте, kvasya, Вы писали:

K>Здравствуйте, galex1981, Вы писали:


G>>Задание звучит так: Есть 2 самомтоятельных приложения, которые связаны между собой тем, что одно генерирует входные данные для другого. Требуется командная оболочка, которая управляет механизмом генерации данных с одного приложения и пересылом их в другое. Причем объединить первые 2 нельзя по условию, а то я бы так и сделал бы


K>Типовой IPC. По форуму, я думаю можно даже исходники найти.

K>Именованные каналы, TCP/IP, сообщения Windows. Способов много.

K>Полагаю, именованные каналы (named pipes) — то, что вам нужно (коль речь зашла об окнах).

K>Хотя, если gui не догма, я лично предпочел бы unix-way: читать stdin, писать в stdout, ошибки в stderr.

По взаимодействию процессов я понял. Попробовал Named pipes — меня устраивает. Но все таки по моему вопросу по поводу закрытия окна — что сделать чтобы оно сразу не закрывалось?
Re[7]: Встраивание одной программы в другую
От: kvasya  
Дата: 07.07.10 07:39
Оценка: +1
Здравствуйте, galex1981, Вы писали:

G>По взаимодействию процессов я понял. Попробовал Named pipes — меня устраивает. Но все таки по моему вопросу по поводу закрытия окна — что сделать чтобы оно сразу не закрывалось?


Откровенно говоря мне лень даже пытаться об этом думать . Может кто-то другой захочет проанализировать.
Такого рода хаки ("межпроцессорные" окна) представляются мне полем граблей, ходить по которым я лично не хотел бы. Как минимум нужно четко представлять все процессы и механизмы в этом контексте, чтобы создать стабильный код. Я такой квалификацией не обладаю.

Если уж так хочется заставить это работать — локализуйте проблему. сделайте трассировку, посмотрите отладчиком, что именно происходит, о каких ошибках говорит система... ну как обычно
Re: Встраивание одной программы в другую
От: Stanislav V. Zudin Россия  
Дата: 07.07.10 08:55
Оценка: 1 (1)
Здравствуйте, galex1981, Вы писали:

G>Здравствуйте всем!

G>Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.

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


(поскипал все лишнее)

G>
G>BOOL CChildAppApp::InitInstance()
G>{
G>    bla-bla-bla
G>      SetRegistryKey(_T("Local AppWizard-Generated Applications"));
G>      //Мой код
G>    CWnd wnd; <-- При выходе из функции в деструкторе вызывается DestroyWindow, между прочим
G>    остальное неинтересно.
G>}

G>


Размер окна ты не задал, при изменении размеров родительского окна никто за тебя изменять размеры дочернего не будет.
Но это все мелочи.

Самое интересное начинается при передаче между окнами каких-нибудь WM_NOTIFY, WM_SIZING и прочих сообщений, содержащих указатели.
Поэтому, как уже выше сказали, не надо так делать.
_____________________
С уважением,
Stanislav V. Zudin
Re[8]: Встраивание одной программы в другую
От: CEMb  
Дата: 07.07.10 16:04
Оценка:
Здравствуйте, kvasya, Вы писали:

G>>По взаимодействию процессов я понял. Попробовал Named pipes — меня устраивает. Но все таки по моему вопросу по поводу закрытия окна — что сделать чтобы оно сразу не закрывалось?


K>Откровенно говоря мне лень даже пытаться об этом думать . Может кто-то другой захочет проанализировать.

K>Такого рода хаки ("межпроцессорные" окна) представляются мне полем граблей, ходить по которым я лично не хотел бы.
Не йог!

K>Если уж так хочется заставить это работать — локализуйте проблему. сделайте трассировку, посмотрите отладчиком, что именно происходит, о каких ошибках говорит система... ну как обычно


Разбираться тоже лень(тоже не йог), но проблем с "налепить одно окно на другое" быть не должно. У меня прога есть, которая запросто между сторонними процессами и окнами детей перекидывает. Даже две.
Советую в обработчике исчезающего окна посмотреть, кто и почему закрывает окно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.