Error lectura de memoria

01/06/2004 - 09:00 por news | Informe spam
He añadido el codigo siguiente, como parte de una funcion, para obtener la
impresora por defecto y el
nombre, driver y port.
Los datos se obtienen bien, pero me da tres errores de "la memoria no se
puede leer" al salir de la funcion, he depurado, repasado y algo se me
escapa, pero ya no lo veo
...
¿Que hago mal?

CWinApp WinApp;
PRINTDLG pd;
LPTSTR lpszDriverName, lpszDeviceName, lpszPortName;
LPDEVNAMES lpDevNames;
pd.lStructSize = (DWORD) sizeof(PRINTDLG);

if (WinApp.GetPrinterDeviceDefaults(&pd))
{


lpDevNames = (LPDEVNAMES)GlobalLock(pd.hDevNames);
lpszDriverName = (LPTSTR )lpDevNames + lpDevNames->wDriverOffset;
lpszDeviceName = (LPTSTR )lpDevNames + lpDevNames->wDeviceOffset;
lpszPortName = (LPTSTR )lpDevNames + lpDevNames->wOutputOffset;

}

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral [MVP]
01/06/2004 - 09:24 | Informe spam
¿Podrias poner la función completa?


Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#2 news
01/06/2004 - 09:31 | Informe spam
Por supuesto.

void CArticulos::OnArticuloEtiquetas()
{

UpdateData(true);
int alto,ancho,netiq;
CEtiquetas Dlg(this);
if(Dlg.DoModal()==IDOK)
{
ancho=Dlg.m_ancho;
alto=Dlg.m_alto;
netiq=Dlg.netiq;
for (int i=0;i<netiq;i++)
m_pBD->Execute("INSERT INTO etiquetasauxiliar (codigo, precio) SELECT
codigo, preciopvp FROM articulos WHERE codigo ='"+m_codigo+"'");

UpdateData(false);
m_etiquetas.SetReportFileName("artetiq.rpt");

m_etiquetas.ReplaceSelectionFormula("{etiquetasauxiliar.codigo}='"+m_codigo+
"'");

m_etiquetas.SetMarginLeft((ancho-1)*3970);//margen izquierdo
m_etiquetas.SetMarginTop(((alto-1)*1984)+481);//margen alto

m_etiquetas.SetDestination(1);
//Selecciona impresora por defecto
CWinApp WinApp;
PRINTDLG pd;
LPTSTR lpszDriverName, lpszDeviceName, lpszPortName;
LPDEVNAMES lpDevNames;
pd.lStructSize = (DWORD) sizeof(PRINTDLG);

if (WinApp.GetPrinterDeviceDefaults(&pd))
{


lpDevNames = (LPDEVNAMES)GlobalLock(pd.hDevNames);
lpszDriverName = (LPTSTR )lpDevNames + lpDevNames->wDriverOffset;
lpszDeviceName = (LPTSTR )lpDevNames + lpDevNames->wDeviceOffset;
lpszPortName = (LPTSTR )lpDevNames + lpDevNames->wOutputOffset;
GlobalUnlock(pd.hDevNames);
GlobalFree(pd.hDevNames);
}

m_etiquetas.SetPrinterName(lpszDeviceName);
m_etiquetas.SetPrinterDriver(lpszDriverName);
m_etiquetas.SetPrinterPort(lpszPortName);
m_etiquetas.PrintReport();
}



m_pBD->Execute("DELETE FROM etiquetasauxiliar WHERE codigo
='"+m_codigo+"'");

}

"Rodrigo Corral [MVP]" escribió en el mensaje
news:
¿Podrias poner la función completa?


Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net


Respuesta Responder a este mensaje
#3 Rodrigo Corral [MVP]
01/06/2004 - 10:32 | Informe spam
Hombre, así a simple vista parece que:

1) Si tu código no entra por

if (WinApp.GetPrinterDeviceDefaults(&pd))
{


...
}



Aqui:

m_etiquetas.SetPrinterName(lpszDeviceName);
m_etiquetas.SetPrinterDriver(lpszDriverName);
m_etiquetas.SetPrinterPort(lpszPortName);



estarás usando punteros sin inicializar.

2) Liberas memoria que luego utilizas

lpszDriverName = (LPTSTR )lpDevNames + lpDevNames->wDriverOffset;
lpszDeviceName = (LPTSTR )lpDevNames + lpDevNames->wDeviceOffset;
lpszPortName = (LPTSTR )lpDevNames + lpDevNames->wOutputOffset;
GlobalUnlock(pd.hDevNames);
GlobalFree(pd.hDevNames);



Utilizas lpszDriverName, lpszDeviceName, lpszPortName que apuntan a
(LPTSTR )lpDevNames + lpDevNames->wDriverOffset, (LPTSTR )lpDevNames +
lpDevNames->wDeviceOffset, (LPTSTR )lpDevNames + lpDevNames->wOutputOffset,
pero ya has hecho GlobalUnlock(pd.hDevNames) y
GlobalFree(pd.hDevNames).

Prueba modificando la función del siguiente modo:

if (WinApp.GetPrinterDeviceDefaults(&pd))
{
lpDevNames = (LPDEVNAMES)GlobalLock(pd.hDevNames);

m_etiquetas.SetPrinterName((LPTSTR )lpDevNames +
lpDevNames->wDeviceOffset));
m_etiquetas.SetPrinterDriver((LPTSTR )lpDevNames +
lpDevNames->wDriverOffset));
m_etiquetas.SetPrinterPort((LPTSTR )lpDevNames +
lpDevNames->wOutputOffset));
m_etiquetas.PrintReport();

GlobalUnlock(pd.hDevNames);
GlobalFree(pd.hDevNames);
}

Ya me contarás...

Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#4 news
01/06/2004 - 23:47 | Informe spam
Probado :(
Exactamente los mismos errores.

"Rodrigo Corral [MVP]" escribió en el mensaje
news:%
Hombre, así a simple vista parece que:

1) Si tu código no entra por

> if (WinApp.GetPrinterDeviceDefaults(&pd))
> {
...
> }

Aqui:

> m_etiquetas.SetPrinterName(lpszDeviceName);
> m_etiquetas.SetPrinterDriver(lpszDriverName);
> m_etiquetas.SetPrinterPort(lpszPortName);

estarás usando punteros sin inicializar.

2) Liberas memoria que luego utilizas

> lpszDriverName = (LPTSTR )lpDevNames + lpDevNames->wDriverOffset;
> lpszDeviceName = (LPTSTR )lpDevNames + lpDevNames->wDeviceOffset;
> lpszPortName = (LPTSTR )lpDevNames + lpDevNames->wOutputOffset;
> GlobalUnlock(pd.hDevNames);
> GlobalFree(pd.hDevNames);

Utilizas lpszDriverName, lpszDeviceName, lpszPortName que apuntan a
(LPTSTR )lpDevNames + lpDevNames->wDriverOffset, (LPTSTR )lpDevNames +
lpDevNames->wDeviceOffset, (LPTSTR )lpDevNames +


lpDevNames->wOutputOffset,
pero ya has hecho GlobalUnlock(pd.hDevNames) y
GlobalFree(pd.hDevNames).

Prueba modificando la función del siguiente modo:

if (WinApp.GetPrinterDeviceDefaults(&pd))
{
lpDevNames = (LPDEVNAMES)GlobalLock(pd.hDevNames);

m_etiquetas.SetPrinterName((LPTSTR )lpDevNames +
lpDevNames->wDeviceOffset));
m_etiquetas.SetPrinterDriver((LPTSTR )lpDevNames +
lpDevNames->wDriverOffset));
m_etiquetas.SetPrinterPort((LPTSTR )lpDevNames +
lpDevNames->wOutputOffset));
m_etiquetas.PrintReport();

GlobalUnlock(pd.hDevNames);
GlobalFree(pd.hDevNames);
}

Ya me contarás...

Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net


Respuesta Responder a este mensaje
#5 Rodrigo Corral [MVP]
02/06/2004 - 09:20 | Informe spam
¿Los errores cuando se producen al ejecutar que linea? En el código no veo
nada raro, pero puede que se me escape algo...


Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida