Здравствуйте всем!
Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.
Идея такова: В головной программе передаю дескриптор рамки (HWND) параметром в дочернюю программу. Пример ниже:
В дочерней программе в 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;
}
Здравствуйте, galex1981, Вы писали:
G>Здравствуйте всем! G>Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.
G>Идея такова: В головной программе передаю дескриптор рамки (HWND) параметром в дочернюю программу. Пример ниже:
Здравствуйте, kvasya, Вы писали:
K>Здравствуйте, galex1981, Вы писали:
G>>Здравствуйте всем! G>>Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.
G>>Идея такова: В головной программе передаю дескриптор рамки (HWND) параметром в дочернюю программу. Пример ниже:
K>Не надо так делать))
А как надо делать?
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, galex1981, Вы писали:
G>>Таково задание. Что-нибудь посоветуете?
Ops>А какое задание? Вы бы озвучили его полностью, а с тем что есть — прелагаю COM-сервер(OLE?) + COM-клиент, раз уж на винапи писать начали.
Задание звучит так: Есть 2 самомтоятельных приложения, которые связаны между собой тем, что одно генерирует входные данные для другого. Требуется командная оболочка, которая управляет механизмом генерации данных с одного приложения и пересылом их в другое. Причем объединить первые 2 нельзя по условию, а то я бы так и сделал бы
Здравствуйте, galex1981, Вы писали:
G>Задание звучит так: Есть 2 самомтоятельных приложения, которые связаны между собой тем, что одно генерирует входные данные для другого. Требуется командная оболочка, которая управляет механизмом генерации данных с одного приложения и пересылом их в другое. Причем объединить первые 2 нельзя по условию, а то я бы так и сделал бы
Типовой IPC. По форуму, я думаю можно даже исходники найти.
Именованные каналы, TCP/IP, сообщения Windows. Способов много.
Полагаю, именованные каналы (named pipes) — то, что вам нужно (коль речь зашла об окнах).
Хотя, если gui не догма, я лично предпочел бы unix-way: читать stdin, писать в stdout, ошибки в stderr.
Здравствуйте, kvasya, Вы писали:
K>Здравствуйте, galex1981, Вы писали:
G>>Задание звучит так: Есть 2 самомтоятельных приложения, которые связаны между собой тем, что одно генерирует входные данные для другого. Требуется командная оболочка, которая управляет механизмом генерации данных с одного приложения и пересылом их в другое. Причем объединить первые 2 нельзя по условию, а то я бы так и сделал бы
K>Типовой IPC. По форуму, я думаю можно даже исходники найти. K>Именованные каналы, TCP/IP, сообщения Windows. Способов много.
K>Полагаю, именованные каналы (named pipes) — то, что вам нужно (коль речь зашла об окнах). K>Хотя, если gui не догма, я лично предпочел бы unix-way: читать stdin, писать в stdout, ошибки в stderr.
По взаимодействию процессов я понял. Попробовал Named pipes — меня устраивает. Но все таки по моему вопросу по поводу закрытия окна — что сделать чтобы оно сразу не закрывалось?
Здравствуйте, galex1981, Вы писали:
G>По взаимодействию процессов я понял. Попробовал Named pipes — меня устраивает. Но все таки по моему вопросу по поводу закрытия окна — что сделать чтобы оно сразу не закрывалось?
Откровенно говоря мне лень даже пытаться об этом думать . Может кто-то другой захочет проанализировать.
Такого рода хаки ("межпроцессорные" окна) представляются мне полем граблей, ходить по которым я лично не хотел бы. Как минимум нужно четко представлять все процессы и механизмы в этом контексте, чтобы создать стабильный код. Я такой квалификацией не обладаю.
Если уж так хочется заставить это работать — локализуйте проблему. сделайте трассировку, посмотрите отладчиком, что именно происходит, о каких ошибках говорит система... ну как обычно
Здравствуйте, 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
Здравствуйте, kvasya, Вы писали:
G>>По взаимодействию процессов я понял. Попробовал Named pipes — меня устраивает. Но все таки по моему вопросу по поводу закрытия окна — что сделать чтобы оно сразу не закрывалось?
K>Откровенно говоря мне лень даже пытаться об этом думать . Может кто-то другой захочет проанализировать. K>Такого рода хаки ("межпроцессорные" окна) представляются мне полем граблей, ходить по которым я лично не хотел бы.
Не йог!
K>Если уж так хочется заставить это работать — локализуйте проблему. сделайте трассировку, посмотрите отладчиком, что именно происходит, о каких ошибках говорит система... ну как обычно
Разбираться тоже лень(тоже не йог), но проблем с "налепить одно окно на другое" быть не должно. У меня прога есть, которая запросто между сторонними процессами и окнами детей перекидывает. Даже две.
Советую в обработчике исчезающего окна посмотреть, кто и почему закрывает окно.