Problemas con Excel desde VC++

30/11/2004 - 16:37 por jose | Informe spam
Hola grupo,

Estoy desarrollando una aplicación VC++ con MFC.

En la aplicación genero unos informes que son ficheros excel.
Lo primero que hago en la aplicación es llamar a la función AfxOleInit(),
que se inicializa correctamente.
Luego, una vez seleccionado el tipo de informe, para generar el fichero
excel hago:

BOOL GenerarInforme()
{
BOOL bOk = FALSE;
_Application appExcel;
try
{
appExcel.CreateDispatch( "Excel.Application" );
appExcel.SetDisplayAlerts( FALSE );
// .
// .
// codigo que genera el informe
// y lo guarda en un fichero
bOk = TRUE;
}
catch( COleException *e )
{
// ProcesarExcepcion( e );
bOk = FALSE;
}
catch( COleDispatchException *e )
{
// ProcesarExcepcion( e );
bOk = FALSE;
}
appExcel.Quit();
return bOk;
}

El informe se genera a la perfección.
El problema es que cuando finaliza la generación del informe, el excel se
queda en memoria y tengo que utilizar el administrador de tareas para
eliminar el proceso.

¿alguna idea de qué es lo que puede pasar?

Un saludo y muchas gracias por vuestra atención,

Jose

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral [MVP]
30/11/2004 - 17:50 | Informe spam
_Application.Quit();

Cuando hayas terminado...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#2 Rodrigo Corral [MVP]
30/11/2004 - 17:52 | Informe spam
Perdon...

appExcel.Quit();


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#3 jose
30/11/2004 - 18:02 | Informe spam
"Rodrigo Corral [MVP]" wrote in
news:exQt#:

Perdon...

appExcel.Quit();





Es justo lo que hago antes del return de la función, incluso aunque se
produzca una excepción:

BOOL GenerarInforme()
{
BOOL bOk = FALSE;
_Application appExcel;
try
{
// codigo que genera el informe
// y lo guarda en un fichero
bOk = TRUE;
}
catch( COleException *e )
{
// ProcesarExcepcion( e );
bOk = FALSE;
}
catch( COleDispatchException *e )
{
// ProcesarExcepcion( e );
bOk = FALSE;
}


appExcel.Quit();

return bOk;
}
Respuesta Responder a este mensaje
#4 Rodrigo Corral [MVP]
30/11/2004 - 18:29 | Informe spam
Yo para automatización suelo usar los smart pointers de #import no los de
MFC

appExcel.GetActiveObject(__uuidof(Application)); //Por si ya esta activo
excel
if (appExcel == NULL)
appExcel.CreateInstance(__uuidof(Application)); //Si no esta activo

Y luego el Quit()

No se si podrás probar algo similar con MFC

Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#5 jose
03/12/2004 - 14:43 | Informe spam
Finalmente lo he conseguido de la siguiente forma:


1. Elimino la llamada a AfxOleInit()
2. Para llamar a GenerarInforme() utilizo el siguiente código:

HRESULT hRes = OleInitialize( NULL );
if( hRes != S_OK ) return;

GenerarInforme();

CoUninitialize();

Y el excel se libera de la memoria.

Saludos,

Jose


"Rodrigo Corral [MVP]" wrote in
news::

Yo para automatización suelo usar los smart pointers de #import no los
de MFC

appExcel.GetActiveObject(__uuidof(Application)); //Por si ya esta
activo excel
if (appExcel == NULL)
appExcel.CreateInstance(__uuidof(Application)); //Si no esta activo

Y luego el Quit()

No se si podrás probar algo similar con MFC

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida