mfc - CDialog:: Create falla para el diálogo con control ActiveX
com-server (5)
Tengo un módulo que crea un cuadro de diálogo no modal que contiene un control ActiveX. Este módulo era parte de una aplicación EXE de MFC y la creación del diálogo funcionó bien. Recientemente, moví el módulo a un servidor ATL / COM y copié el recurso de diálogo del EXE en el servidor COM. Al intentar crear el cuadro de diálogo no modal utilizando CDialog::Create()
ocurre un error.
CDialog::Create
en CDialog::Create
y noté que falla en ::CreateDialogIndirect()
que devuelve NULL
y GetLastError
devuelve 0
. Cambié el indicador "No Fail Create" a True en las propiedades del recurso de diálogo y obtengo más detalles sobre el error. El problema ocurre en el diálogo DoDataExchange()
dentro de la macro DDX_Control
. Esto llama a CDataExchange::PrepareCtrl()
con el ID de recurso del control de la siguiente manera:
HWND CDataExchange::PrepareCtrl(int nIDC)
{
ASSERT(nIDC != 0);
ASSERT(nIDC != -1); // not allowed
HWND hWndCtrl;
COleControlSite* pSite = NULL;
m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
if (hWndCtrl == NULL)
{
// Could be a windowless OCX
pSite = m_pDlgWnd->GetOleControlSite(nIDC);
if (pSite == NULL)
{
TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X./n", nIDC);
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
}
m_idLastControl = nIDC;
m_bEditLastControl = FALSE; // not an edit item by default
return hWndCtrl;
}
La llamada a la función m_pDlgWnd->GetOleControlSite()
falla para el ID de recurso pasado. Por cierto, la ID del recurso es la ID del control.
¿Alguna sugerencia sobre por qué esto funciona dentro del EXE y falla en el servidor COM?
Tuve un problema similar el otro día. Copió un control de un recurso de diálogo a otro. Como sucedió, no puede simplemente copiar un control ActiveX de un diálogo a otro de la misma manera que lo hace con otros controles MFC. Para un control ActiveX, el archivo rc contiene una sección DLGINIT. Por ejemplo, tengo un formulario con un control IE WebBrowser:
IDD_ONLINE_REPORTVIEW_FORM DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_CONTROL | WS_CHILD
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
CONTROL "",IDC_EXPLORER1,"{8856F961-340A-11D0-A96B-00C04FD705A2}",WS_TABSTOP,7,61,299,77
END
y debajo en el archivo rc, hay una sección DLGINIT:
IDD_ONLINE_REPORTVIEW_FORM DLGINIT
BEGIN
IDC_EXPLORER1, 0x376, 160, 0
0x0000, 0x0000, 0x004c, 0x0000, 0x2e68, 0x0000, 0x0ceb, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x004c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0000, 0xd0e0, 0x0057, 0x3573, 0x11cf, 0x69ae, 0x0008, 0x2e2b, 0x6212,
0x0008, 0x0000, 0x0000, 0x0000, 0x004c, 0x0000, 0x1401, 0x0002, 0x0000,
0x0000, 0x00c0, 0x0000, 0x0000, 0x4600, 0x0080, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0
END
Abra la fuente del archivo rc y busque su ID de control. Busque la sección DLGINIT y cópiela en su nuevo diálogo
Tuve exactamente el mismo problema. En mi caso, el problema resultó ser que no había llamado a AfxEnableControlContainer (). Agregué una llamada a eso en la función miembro de InitInstance de mi aplicación y solucionó el problema.
En mi caso, puse una ID de Dialogo equivocada mientras llamaba
BOOL Create(UINT nID, CWnd * pWnd);
Falló tanto en DoDataExchange()
.
Aquí hay otra situación en la que uno puede obtener las mismas advertencias de la supresión de depuración (Error: no hay control de intercambio de datos con dlgdata de ID: línea 40):
por ejemplo, si crea una instancia de diálogo de CDialogExExample mediante la función virtual CDialogExExample :: Create (CONTROL_ID, ..), mientras que CONTROL_ID es inconstante con IDD_EXAMPLE (enum {IDD = IDD_EXAMPLE};) en el archivo de encabezado CDialogExExample .... luego uno podría agregar control falla siempre.
¡Aquí hay un enlace inspirador de msdn !
puede ser útil para alguien :)
PD: esta situación puede ser la misma con la respuesta de @Hank Chang
En mi caso, tenía un cuadro de diálogo MFC que aloja el control de .NET UI a través de ActiveX.
Después de la depuración encontré, DoModal falló y devolvió -1 y GetLastError dio 0.
Después de un día de depuración, resultó ser un problema de discrepancia de la versión de .NET Assemblies. Esto conduce a la falla de creación de instancias de control OLE.
Extracto de WinDBG:
(21b0.71cc): excepción CLR: código e0434352 (primera oportunidad) CoCreateInstance del control OLE {EE3C4329-83A8-4DD8-A74C-680AC01AC593} error.
Código de resultado: 0x80131040
HRESULT valor 0x80131040 significado:
La definición del manifiesto del ensamblaje ubicado no coincide con la referencia de ensamblaje.