Riepilogo

In questo articolo illustrato dall'esempio per estrarre le foto di bitmap del database Nwind. mdb di Microsoft Access 97 e visualizzati da un browser Web utilizzando pagine ASP (ASP). Per eseguire questa operazione, una DLL ActiveX devono essere creata come intestazioni di accesso e di OLE che strisce dal campo. In questo articolo viene illustrato come creare la DLL di ActiveX e la relativa implementazione.

Ulteriori informazioni

Avviso: l'utilizzo del codice fornito IN questo articolo è a proprio rischio. Microsoft fornisce questo codice "così com'è" senza garanzie di alcun tipo, espresse o implicita, ivi incluse le garanzie implicite di commerciabilità o idoneità per uno scopo particolare.


In questo articolo viene illustrato come utilizzare Visual Basic per recuperare un'immagine bitmap memorizzate in un campo oggetto OLE. Poiché la definizione di archiviazione degli oggetti OLE non è documentata, il codice seguente cerca intestazione OLE dell'oggetto per i caratteri coerente con l'inizio dell'elemento grafico. Questo metodo potrebbe non funzionare in tutte le circostanze.


Si tenga presente che Internet Explorer 3.0 non è in grado di visualizzare immagini bitmap a colori true. Per questo motivo, le bitmap memorizzate nel database di Access devono essere non superiore a 256 colori.

Esempio passo passo per estrarre le Foto

  1. Creare un nuovo progetto in Visual Basic e rendere il progetto DLL ActiveX.

  2. Aggiungere un riferimento a Microsoft ActiveX Data Objects (ADO) scegliendo Riferimenti dal menu progetto. Selezionare "Microsoft OLE DB ActiveX Data Objects 1.0 Library" e fare clic su OK.

  3. Aggiungere un nuovo modulo al progetto selezionando dal menu progetto e scegliendo Aggiungi modulo. Selezionare modulo, fare clic su Apri.

  4. Inserire il codice seguente nella sezione (generale) (dichiarazioni) di 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
  5. Inserire il codice seguente nella sezione (generale) (dichiarazioni) di 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
  6. Rinominare il progetto selezionando dal menu progetto e scegliendo "Proprietà Progetto1" e digitare il nuovo nome nel campo "Nome progetto". In questo esempio si presuppone che è denominato il progetto "Progetto" e farà riferimento a tale nome nei passaggi successivi.

  7. Selezionare la casella di controllo "Esecuzione automatica". Fare clic su OK.

  8. Rinominare la classe nel riquadro proprietà. In questo esempio presuppone che sia la classe denominata "MyClass" e fa riferimento a tale nome nei passaggi successivi.

  9. Compilare la DLL dal menu File e selezionando "Make MyProject.dll".

  10. Creare una pagina ASP denominata "bitmap.asp" che contiene il codice riportato di seguito:

          <%@ 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
    %>
  11. Creare una pagina HTML denominata "BitmapTest.htm" che contiene il codice riportato di seguito:

          <HTML>
    <HEAD>
    <TITLE>Bitmap Test</TITLE>
    </HEAD>
    <BODY>
    <HR>
    <img src="Bitmap.asp">
    <HR>
    </BODY>
    </HTML>

Riferimenti

Per ulteriori informazioni, vedere il seguente articolo della Microsoft Knowledge Base:

173308 modalità di visualizzazione delle immagini memorizzate in un campo BLOB

Per ottenere la Knowledge Base più recenti e altre informazioni di supporto su Visual InterDev e pagine ASP, vedere la seguente pagina sul sito di supporto tecnico Microsoft:

http://support.microsoft.com/search/default.aspx?qu=vinterdev

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Quanto ti soddisfa la qualità della traduzione?

Cosa ha influito sulla tua esperienza?

Altri commenti e suggerimenti? (Facoltativo)

Grazie per il feedback!

×