Вставка картинки в таблицу Access через OLE (VB6)

Узнай цену своей работы

Формулировка задачи:

Есть таблица в Access 2003 с полем объекта OLE, в котором хранятся картинки jpg. И есть форма с OLE куда картинка загружается из базы. Я не могу понять как сделать связь в обратную сторону, чтобы через форму в таблицу загружать картинку, при добавлении новой записи или изменении существующей. Заранее благодарен за помощь. P.S. мои знания vb равны 6 часам, так что сильно не бейте.

Решение задачи: «Вставка картинки в таблицу Access через OLE (VB6)»

textual
Листинг программы
Option Explicit
 
Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (lpString1 As Any, lpString2 As Any, ByVal iMaxLength As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (lpString As Any) As Long
Private Declare Function CreateStreamOnHGlobal Lib "ole32.dll" (hGlobal As Any, ByVal fDeleteOnResume As Long, ppstr As Any) As Long
Private Declare Function OleLoadPicture Lib "olepro32.dll" (ByVal lpStream As IUnknown, ByVal lSize As Long, ByVal fRunMode As Long, riid As Any, lplpObj As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpsz As Long, pclsid As Any) As Long
 
Private Const IID_IPicture As String = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
 
Private Const OBJECT_SIGNATURE = &H1C15
Private Const OBJECT_HEADER_SIZE = 20
 
Private Type PT
    Width               As Integer
    Height              As Integer
End Type
Private Type OBJECTHEADER
   Signature            As Integer         '0x1c15
   HeaderSize           As Integer
   ObjectType           As Long
   NameLen              As Integer
   ClassLen             As Integer
   NameOffset           As Integer
   ClassOffset          As Integer
   ObjectSize           As PT
End Type
Private Type OLEHEADER
   OleVersion           As Long
   Format               As Long
   OleTypeNameLength    As Long
End Type
 
Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
    Dim z()         As Byte
    Dim f           As Field
    Dim p           As Long
    Dim guid(15)    As Byte
    Dim pic         As IPicture
    Dim stm     As IUnknown
    Dim dat()   As Byte
 
    If pRecordset.EOF Or pRecordset.BOF Then Exit Sub
    
    Set f = pRecordset.Fields(3)
    
    CLSIDFromString StrPtr(IID_IPicture), guid(0)
 
    
    If f.ActualSize > OBJECT_HEADER_SIZE Then
        Dim hdr     As OBJECTHEADER
        Dim Name    As String
        Dim Class   As String
    
        z = f.Value
        
        Open "D:\Temp\Temp.dat" For Binary As 1
        Put 1, , z
        Close 1
    
        memcpy hdr, z(0), OBJECT_HEADER_SIZE
        
        If hdr.Signature <> OBJECT_SIGNATURE Then
            ' Сырые данные
            
            If CreateStreamOnHGlobal(z(0), False, stm) = 0 Then
                OleLoadPicture stm, UBound(z) + 1, False, guid(0), pic
                Set picPictureBox = pic
                Set stm = Nothing
            End If
        Else
            ' OLE обертка
            Name = Space(hdr.NameLen - 1)
            lstrcpyn ByVal Name, z(hdr.NameOffset), hdr.NameLen
            Class = Space(hdr.ClassLen - 1)
            lstrcpyn ByVal Class, z(hdr.ClassOffset), hdr.ClassLen
            
            Dim olehdr  As OLEHEADER
            Dim typName As String
            Dim size(2) As Long
            
            memcpy olehdr, z(hdr.HeaderSize), Len(olehdr)
            p = hdr.HeaderSize + 12
            typName = Space(olehdr.OleTypeNameLength - 1)
            lstrcpyn ByVal typName, z(p), olehdr.OleTypeNameLength
            p = p + olehdr.OleTypeNameLength
            
            Select Case typName
            Case "PBrush"
                memcpy size(0), z(p), 12
                ReDim dat(size(2) - 1)
                memcpy dat(0), z(p + 12), size(2)
            Case "Package"
                Dim l       As Long
                Dim fName   As String
                Dim fPath   As String
                Dim Path    As String
                ' Получаем имя файла
                p = p + 14
                l = lstrlen(z(p))
                fName = Space(l)
                lstrcpyn ByVal fName, z(p), l + 1
                ' Получаем полный путь
                p = p + l + 1
                l = lstrlen(z(p))
                fPath = Space(l)
                lstrcpyn ByVal fPath, z(p), l + 1
                p = p + l + 5
                GetMem4 z(p), l
                Path = Space(l - 1)
                p = p + 4
                lstrcpyn ByVal Path, z(p), l
                p = p + l
                GetMem4 z(p), l
                ReDim dat(l - 1)
                memcpy dat(0), z(p + 4), l
            End Select
            
            If CreateStreamOnHGlobal(dat(0), False, stm) = 0 Then
                OleLoadPicture stm, size(2), False, guid(0), pic
                Set stm = Nothing
            End If
            
            Set picPictureBox = pic
        End If
    End If
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.625 из 5
Похожие ответы