SaveBuffer example for Visual Basic

''This sample loads the file 'szFileName', and saves it to memory buffer allocated by the user
'The original memory buffer is 1 bytes, which is too small to accommodate the image
'The SaveBuffer callback gets called as necessary, allowing the user to reallocate the memory buffer as needed
'When the image is completely saved in memory, it is loaded into a second LEAD control
'
'The following declarations are for calling Windows API's to allocate memory
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapReAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal lpMem As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal lpMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 
Private Declare Function HeapCreate Lib "kernel32" (ByVal flOptions As Long, ByVal dwInitialSize As Long, ByVal dwMaximumSize As Long) As Long
Private Declare Function HeapDestroy Lib "kernel32" (ByVal hHeap As Long) As Long

'The following variables are declared globally
Dim lHeap As Long
Dim lHeapAddress As Long

Private Sub SampleLoadSaveBuffer(szFileName As String) 
    Dim lHeapInitialSize As Long
    Dim lMemInitialSize As Long
    Dim nRet As Integer
    
    'Create the heap
    lHeap = 0
    lHeapInitialSize = 1000
    lHeap = HeapCreate(0, lHeapInitialSize, 0) 
    
    'Allocate the first chunk of memory to be 100 bytes
    lHeapAddress = 0
    lMemInitialSize = 1
    lHeapAddress = HeapAlloc(lHeap, 0, lMemInitialSize) 
    
    RasterIO.Load LEADRasterView1.Raster, szFileName, 0, 0, 1
    RasterIO.SaveBufferSize= lMemInitialSize
    RasterIO.SaveBufferAddress= lHeapAddress
    RasterIO.EnableSaveBufferEvent= True
    nRet = RasterIO.SaveBuffer(LEADRasterView1.Raster, FILE_TIF, 24, 0, SAVE_OVERWRITE) 
    If (nRet <> 0) Then
        MsgBox "SaveBuffer Error: " + Str(nRet) 
    End If
    
    'Load the file in memory into a second LEAD Raster object
    nRet = RasterIO.LoadBuffer(LEADRasterView2.Raster, RasterIO.SaveBufferAddress, 24, 0, 1, LEADRasterView1.Raster.SaveBufferSize
    
    'Free the allocated memory
    HeapFree lHeap, 0, lHeapAddress
    
    'Destroy the heap
    HeapDestroy lHeap
End Sub

Private Sub RasterIO_SaveBuffer (ByVal uRequiredSize As Long) 
'The SaveBuffer event allows the user to reallocate the buffer as needed
    Dim dRet As Long
    lHeapAddress = HeapReAlloc(lHeap, 0, lHeapAddress, uRequiredSize) 
    If (lHeapAddress = 0) Then
        MsgBox "HeapReAlloc Error"
        LEADRasterView1.Raster.EnableSaveBufferEvent = False
    Else
        LEADRasterView1.Raster.SaveBufferSize = uRequiredSize
        LEADRasterView1.Raster.SaveBufferAddress = lHeapAddress
    End If
End Sub