Foros del Web » Programación para mayores de 30 ;) » C/C++ »

OleLoadPicture Cuelgue

Estas en el tema de OleLoadPicture Cuelgue en el foro de C/C++ en Foros del Web. Estoy intendo jugar con imagenes (usando OleLoadPicture), y cuando intento cargar un imagen jpg truncada, es decir, que el archirvo no esta completo, soy incapaz ...
  #1 (permalink)  
Antiguo 23/01/2007, 08:50
Avatar de DeYoN  
Fecha de Ingreso: febrero-2004
Mensajes: 81
Antigüedad: 20 años, 3 meses
Puntos: 0
OleLoadPicture Cuelgue

Estoy intendo jugar con imagenes (usando OleLoadPicture), y cuando intento cargar un imagen jpg truncada, es decir, que el archirvo no esta completo, soy incapaz de detectar el error, no me da aviso como que la carga ha sido erronea, sino que directamente se queda colgado.

¿¿Alguien sabe como solucionar este problema???

Microsoft no me ha dado mucha ayuda.
http://support.microsoft.com/kb/327177/es

Mi entorno de desarrollo:
Microsoft Visual C++ 6.0
Windows XP Service Pack2

Gracias.
  #2 (permalink)  
Antiguo 25/01/2007, 09:17
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: OleLoadPicture Cuelgue

Creo que no leiste esta parte del articulo:

La información de este artículo se refiere a:
• Microsoft Windows NT 4.0 Service Pack 6a

Por otra parte das muy pocos datos, el codigo donde se produce el problema que no describis correctamente seria util. ¿Depuraste el programa? ¿Se produce una excepcion realmente?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 26/01/2007, 07:24
Avatar de DeYoN  
Fecha de Ingreso: febrero-2004
Mensajes: 81
Antigüedad: 20 años, 3 meses
Puntos: 0
Re: OleLoadPicture Cuelgue

Depure el programa y nada.
Intente coger la excepcion con un try-catch y nada.
Simplemente se queda colgado.
La aplicacion es una dll usada por un control ActiveX, recibe una imagen en Base64, la transformo a binario, la meto en un buffer ... y la cargo.
Si la imagen es perfecta no hay ningun problema, pero si la imagen esta incompleta o corrupta, pues se queda colgado.

Código:
if((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, 
                    (LPVOID *)&m_IPicture)) == E_NOINTERFACE)
Gracias.
  #4 (permalink)  
Antiguo 26/01/2007, 08:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: OleLoadPicture Cuelgue

¿Estas seguro de que el problema es en OleLoadPicture? Yo acabo de probar primero abriendo un JPG (CreateFile, ReadFile, CreateStreamOnHGlobal, OleLoadPicture y iPicture->Render) y despues "corrompiendo" esos mismos datos con un codigo de prueba muy pero muy simple y OleLoadPicture es lo suficientemente inteligente como para no devolver un hr de exito y dejar m_IPicture en 0.


Tal vez puedas darnos mas codigo o un binario ...

Código:
        HANDLE hFile = CreateFile("C:\\WINDOWS\\Web\\Wallpaper\\Autumn.jpg", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
	DWORD nSize = GetFileSize(hFile, 0);
	IStream *pStream = 0;
	LPBYTE buff = (LPBYTE)malloc(nSize);
	DWORD read = 0;
	ReadFile(hFile, buff, nSize, &read, 0);
	CloseHandle(hFile);
	 
	HGLOBAL globalAlloc = GlobalAlloc(GMEM_MOVEABLE, nSize);
	LPBYTE imageBuffer = (LPBYTE)GlobalLock(globalAlloc);
	CopyMemory(imageBuffer, buff, nSize);
	GlobalUnlock(globalAlloc);
	CreateStreamOnHGlobal(globalAlloc, true, &pStream);
	
	for (int x = nSize / 2; x < nSize; x++)
	{
		imageBuffer[x] = imageBuffer[x] * 2;
	}

	IPicture *iPicture = NULL;
	printf("0x%X\r\n", OleLoadPicture(pStream, 0, FALSE, IID_IPicture, (void**) &iPicture));
	printf("0x%X\r\n", iPicture);

	if (iPicture)
	{
		HDC hdc = GetDC(0);
		OLE_XSIZE_HIMETRIC width, height;
		iPicture->get_Width(&width);
		iPicture->get_Height(&height);
		LONG cx = GetDeviceCaps(hdc, LOGPIXELSX) * width / 2540;
		LONG cy = GetDeviceCaps(hdc, LOGPIXELSX) * height / 2540;
		iPicture->Render(hdc, 0, 0, cx, cy, 0, height, width, -height, NULL);
		ReleaseDC(0, hdc);
	}
	pStream->Release();
	GlobalFree(globalAlloc);
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 31/01/2007, 04:42
Avatar de DeYoN  
Fecha de Ingreso: febrero-2004
Mensajes: 81
Antigüedad: 20 años, 3 meses
Puntos: 0
Re: OleLoadPicture Cuelgue

El problema es que "hr" no devuelve nada, porque se queda colgado:

Código:
	BOOL bResult = FALSE;

	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize);

	if(hGlobal == NULL)
		{
		return(FALSE);
		}

	void* pData = GlobalLock(hGlobal);
	memcpy(pData, pBuffer, nSize);
	GlobalUnlock(hGlobal);

	IStream* pStream = NULL;

	if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)
		{
		HRESULT hr;
		if((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&m_IPicture)) == E_NOINTERFACE)
			{
			return(FALSE);
			}
		else // S_OK
			{
			if (m_IPicture != NULL)
			{
				m_IPicture->get_Height(&m_Height);
				m_IPicture->get_Width(&m_Width);
				m_IPicture->get_Type(&m_Type);
			}
			pStream->Release();
			pStream = NULL;
			bResult = TRUE;
			m_Type = DetectarType(pBuffer, nSize);
			}
		}

	FreeResource(hGlobal); // 16Bit Windows Needs This (32Bit - Automatic Release)
Decir que he probado cn algunas otras imagenes corruptas, y si que funciona bien, pero cn esta en concreto nose por que da problemas.
¿Es posible que por el algoritmo de descompresión entre en algun bucle infinito? (son conjeturas)
¿Hay algun sitio donde pueda subir la imagen para que la probeis?


Gracias y saludos.
  #6 (permalink)  
Antiguo 31/01/2007, 05:02
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: OleLoadPicture Cuelgue

Cita:
Iniciado por DeYoN Ver Mensaje
Decir que he probado cn algunas otras imagenes corruptas, y si que funciona bien, pero cn esta en concreto nose por que da problemas.
¿Es posible que por el algoritmo de descompresión entre en algun bucle infinito? (son conjeturas)
¿Hay algun sitio donde pueda subir la imagen para que la probeis?
Puede llegar a ser, no se puede descartar nada ... para saberlo hay que depurarlo, de otra manera es imposible.

Podes probar aca (necesitamos el archivo DESPUES de las transformaciones, es decir el buffer tal cual le llega a OleLoadPicture):
http://rapidshare.de/
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 31/01/2007, 06:15
Avatar de DeYoN  
Fecha de Ingreso: febrero-2004
Mensajes: 81
Antigüedad: 20 años, 3 meses
Puntos: 0
Re: OleLoadPicture Cuelgue

Ok, he comprimido la imagen en un rar, para evitar problemas cn el servidor.

http://www.savefile.com/files/455559

sino te importa me dices los resultados, estoy algo intrigado
gracias
  #8 (permalink)  
Antiguo 31/01/2007, 08:13
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: OleLoadPicture Cuelgue

Esto no es una conclusion ni mucho menos ya que no tengo mucho tiempo para estudiarlo pero:

a simple vista tenes razon, hay un bucle infinito y parece que el culpable es asycfilt.dll
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:46.