Здравствуйте всем!
Решаю следующую задачу: Требуется в одной (головной программе) загрузить другую (дочернюю) и поместить окно дочерней программы в рамку головной.
Идея такова: В головной программе передаю дескриптор рамки (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++'