发信人: dongbao()
整理人: dongbao(2002-04-19 16:37:35), 站内信件
|
SUMMARY
=======
This article shows by example how to extract the bitmap photos in the
Microsoft Access 97 Northwind.mdb database, and view them from a Web
browser using Active Server Pages (ASP). In order to accomplish this t ask,
an ActiveX DLL must be created that strips the Access and OLE headers from
the field. This article shows how to create this ActiveX DLL, and how to
implement it.
MORE INFORMATION
================
WARNING: ANY USE BY YOU OF THE CODE PROVIDED IN THIS ARTICLE IS AT YOU R OWN
RISK. Microsoft provides this code "as is" without warranty of any kin d,
either express or implied, including but not limited to the implied
warranties of merchantability and/or fitness for a particular purpose.
This article demonstrates how to use Visual Basic to retrieve a bitmap
stored in an OLE Object field. Because the definition of OLE object st orage
is not documented, the following code searches the object's OLE header for
characters consistent with the start of the graphic. This method may n ot
work in all circumstances.
Be aware that Internet Explorer 3.0 is unable to display true color
bitmaps. For this reason, the bitmaps stored in the Access database sh ould
be no higher than 256 colors.
Step-by-Step Example to Extract the Photos
------------------------------------------
1. Create a new project in Visual Basic and make the project an Active X
DLL.
2. Add a reference to ActiveX Data Objects (ADO) by clicking the Proje ct
menu and selecting References. Select "Microsoft OLE DB ActiveX Dat a
Objects 1.0 Library" and click OK.
3. Add a new module to the project by selecting the Project menu and
clicking Add Module. Select Module and click Open.
4. Place the following code in the (general) (declarations) section of
MODULE1.BAS:
' Enter the following Declare statement as one single line:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemor y"
(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. Place the following code in the (general) (declarations) section of
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 head er.
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. Rename the Project by selecting the Project menu, and clicking on
"Project1 Properties" and type your new name in the "Project Name"
field. This example assumes that you named the project "MyProject" and
will refer to that name in future steps.
7. Make the project Apartment Model Threaded by selecting the
"Unattended Execution" check box. Click OK.
8. Rename the Class in the Property Pane. This example assumes that yo u
named the class "MyClass" and refers to that name in future steps.
9. Compile the DLL by clicking the File menu and selecting "Make
MyProject.dll."
10. Create an ASP page named "bitmap.asp" that contains the
following code:
<%@ 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. Create an HTML page named "BitmapTest.htm" that contains
the following code:
<HTML>
<HEAD>
<TITLE>Bitmap Test</TITLE>
</HEAD>
<BODY>
<HR>
<img src="Bitmap.asp">
<HR>
</BODY>
</HTML>
REFERENCES
==========
For additional information, please see the following article in the
Microsoft Knowledge Base:
ARTICLE-ID: Q173308
TITLE : HOWTO: Displaying Images Stored in a BLOB Field
-- ICQ:43395237 OICQ:126132
我自豪我用正版,我骄傲我用盗版!!!
※ 来源:.月光程序代码网 http://www.moon-soft.com.[FROM: 202.108.5.134]
|
|