Resumen
En este artículo se muestra por ejemplo cómo extraer las fotos de mapa de bits en la base de datos de Microsoft Access 97 Nwind.mdb y verlos desde un explorador Web mediante páginas Active Server (ASP). Para realizar esta tarea, una DLL de ActiveX debe crearse esa tiras los encabezados acceso y OLE del campo. Este artículo muestra cómo crear esta DLL ActiveX y cómo implementarlo.
Más información
Advertencia: cualquier uso del código proporcionado en este artículo queda bajo su propia responsabilidad. Microsoft proporciona este código "tal cual" sin garantía de ningún tipo, expresa o implícita, incluyendo pero sin limitarse a las garantías implícitas de comerciabilidad y/o idoneidad para un propósito particular.
En este artículo se muestra cómo utilizar Visual Basic para recuperar un mapa de bits almacenado en un campo objeto OLE. Dado que la definición de almacenamiento de objetos OLE no está documentada, el código siguiente busca en el encabezado del objeto OLE para caracteres coherentes con el inicio del gráfico. Este método no funcionen en todas las circunstancias.
Tenga en cuenta que Internet Explorer 3.0 es incapaz de mostrar mapas de bits de color verdadero. Por esta razón, los mapas de bits almacenados en la base de datos de Access deben ser no superior a 256 colores.
Ejemplo paso a paso para extraer las Fotos
-
Cree un nuevo proyecto en Visual Basic y convertir el proyecto en una DLL de ActiveX.
-
Agregue una referencia a objetos de datos ActiveX (ADO) haciendo clic en el menú proyecto y seleccionando referencias. Seleccione "Microsoft OLE DB ActiveX Data Objects 1.0 Library" y haga clic en Aceptar.
-
Agregue un módulo nuevo al proyecto seleccionando el menú proyecto y haga clic en Agregar módulo. Seleccione el módulo y haga clic en Abrir.
-
Coloque el código siguiente en la sección (general) (declaraciones) de MODULE1. BAS:
' Enter the following Declare statement as one single line:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Type PT
Width As Integer
Height As Integer
End Type
Type OBJECTHEADER
Signature As Integer
HeaderSize As Integer
ObjectType As Long
NameLen As Integer
ClassLen As Integer
NameOffset As Integer
ClassOFfset As Integer
ObjectSize As PT
OleInfo As String * 256
End Type -
Coloque el código siguiente en la sección (general) (declaraciones) de CLASS1. CLS:
Function DisplayBitmap(ByVal OleField As Variant)
Dim Arr() As Byte
Dim ObjHeader As OBJECTHEADER
Dim Buffer As String
Dim ObjectOffset As Long
Dim BitmapOffset As Long
Dim BitmapHeaderOffset As Integer
Dim ArrBmp() As Byte
Dim i As Long
'Resize the array, then fill it with
'the entire contents of the field
ReDim Arr(OleField.ActualSize)
Arr() = OleField.GetChunk(OleField.ActualSize)
'Copy the first 19 bytes into a variable
'of the OBJECTHEADER user defined type.
CopyMemory ObjHeader, Arr(0), 19
'Determine where the Access Header ends.
ObjectOffset = ObjHeader.HeaderSize + 1
'Grab enough bytes after the OLE header to get the bitmap header.
Buffer = ""
For i = ObjectOffset To ObjectOffset + 512
Buffer = Buffer & Chr(Arr(i))
Next i
'Make sure the class of the object is a Paint Brush object
If Mid(Buffer, 12, 6) = "PBrush" Then
BitmapHeaderOffset = InStr(Buffer, "BM")
If BitmapHeaderOffset > 0 Then
'Calculate the beginning of the bitmap
BitmapOffset = ObjectOffset + BitmapHeaderOffset - 1
'Move the bitmap into its own array
ReDim ArrBmp(UBound(Arr) - BitmapOffset)
CopyMemory ArrBmp(0), Arr(BitmapOffset), UBound(Arr) -
BitmapOffset + 1
'Return the bitmap
DisplayBitmap = ArrBmp
End If
End If
End Function -
Cambie el nombre del proyecto seleccionando el menú proyecto y haga clic en "Propiedades de Project1" y escriba el nuevo nombre en el campo "Nombre de proyecto". En este ejemplo se supone que denomina el proyecto "Miproyecto" y hará referencia a ese nombre en pasos posteriores.
-
Active la casilla de verificación "Ejecución desatendida". Haga clic en Aceptar.
-
Cambiar el nombre de la clase en el panel de propiedades. En este ejemplo se supone que denominada "MyClass" de la clase y hace referencia a ese nombre en pasos posteriores.
-
Compile la DLL haciendo clic en el menú archivo y seleccionando "Hacer MyProject.dll."
-
Crear una página ASP denominada "bitmap.asp" que contiene el código siguiente:
<%@ LANGUAGE="VBSCRIPT" %>
<%
' You need to set up a System DSN named 'NWind' that points to
' the Northwind.mdb database
Set DataConn = Server.CreateObject("ADODB.Connection")
DataConn.Open "DSN=NWind", "admin", ""
Set cmdTemp = Server.CreateObject("ADODB.Command")
Set RS = Server.CreateObject("ADODB.Recordset")
cmdTemp.CommandText = "SELECT Photo FROM Employees
WHERE EmployeeID = 1"
cmdTemp.CommandType = 1
Set cmdTemp.ActiveConnection = DataConn
RS.Open cmdTemp, , 0, 1
Response.ContentType = "image/bmp"
Set Bitmap = Server.CreateObject("MyProject.MyClass")
Response.BinaryWrite Bitmap.DisplayBitmap(RS("Photo"))
RS.Close
%> -
Crear una página HTML denominada "BitmapTest.htm" que contiene el código siguiente:
<HTML>
<HEAD>
<TITLE>Bitmap Test</TITLE>
</HEAD>
<BODY>
<HR>
<img src="Bitmap.asp">
<HR>
</BODY>
</HTML>
Referencias
Para obtener información adicional, consulte el artículo siguiente en Microsoft Knowledge Base:
173308 cómo mostrar imágenes almacenadas en un campo BLOB
Para los artículos de Knowledge Base más recientes y otra información de soporte sobre Visual InterDev y páginas Active Server, vea la siguiente página en el sitio de soporte técnico de Microsoft:
http://support.microsoft.com/search/default.aspx?qu=vinterdev