@@ -188,6 +188,10 @@ Private Declare Function IPropertyBag2_Write_Proxy Lib "windowscodecs" (ByVal pP
188
188
#End If
189
189
Private Declare Function GetEnvironmentVariable Lib "kernel32 " Alias "GetEnvironmentVariableW " (ByVal lpName As Long , ByVal lpBuffer As Long , ByVal nSize As Long ) As Long
190
190
Private Declare Function SetEnvironmentVariable Lib "kernel32 " Alias "SetEnvironmentVariableW " (ByVal lpName As Long , ByVal lpValue As Long ) As Long
191
+ Private Declare Function CreateFile Lib "kernel32 " Alias "CreateFileW " (ByVal lpFileName As Long , ByVal dwDesiredAccess As Long , ByVal dwShareMode As Long , ByVal lpSecurityAttributes As Long , ByVal dwCreationDisposition As Long , ByVal dwFlagsAndAttributes As Long , ByVal hTemplateFile As Long ) As Long
192
+ Private Declare Function SetFilePointerEx Lib "kernel32 " (ByVal hFile As Long , ByVal liDistanceToMove As Currency , ByVal lpNewFilePointer As Long , ByVal dwMoveMethod As Long ) As Long
193
+ Private Declare Function SetEndOfFile Lib "kernel32 " (ByVal hFile As Long ) As Long
194
+ Private Declare Function CloseHandle Lib "kernel32 " (ByVal hObject As Long ) As Long
191
195
#End If
192
196
Private Declare Function D3D11CreateDevice Lib "d3d11 " (ByVal pAdapter As IUnknown , ByVal DriverType As D3D_DRIVER_TYPE , ByVal Software As Long , ByVal Flags As D3D11_CREATE_DEVICE_FLAG , pFeatureLevels As Any , ByVal FeatureLevels As Long , ByVal SDKVersion As Long , ppDevice As ID3D11Device , pFeatureLevel As D3D_FEATURE_LEVEL , ppImmediateContext As ID3D11DeviceContext ) As VBHRESULT
193
197
Private Declare Function CreateDXGIFactory1 Lib "dxgi " (riid As VBD3D11 .VBGUID, ppFactory As IDXGIFactory1 ) As VBHRESULT
@@ -476,20 +480,24 @@ Private Enum RfbFileTransferProtocolEnum
476
480
rfbFtpADirRecursiveListItem = 10
477
481
rfbFtpADirRecursiveSize = 11
478
482
479
- ' Content params -- rfbFtpCommand Command
483
+ ' Content params -- rfbFtpCommand
480
484
rfbFtpCDirCreate = 1 ' Request the server to create the given directory
481
485
rfbFtpCDirDelete = 2 ' Request the server to delete the given directory
482
486
rfbFtpCFileCreate = 3 ' Request the server to create the given file
483
487
rfbFtpCFileDelete = 4 ' Request the server to delete the given file
484
488
rfbFtpCFileRename = 5 ' Request the server to rename the given file
485
489
rfbFtpCDirRename = 6 ' Request the server to rename the given directory
486
490
487
- ' Errors -- content params or "size" field
491
+ ' Size param - Errors
488
492
rfbFtpSErrorUnknownCmd = 1 ' Unknown FileTransfer command.
489
493
rfbFtpSErrorCmd = -1 ' Error when a command fails on remote side (ret in "size" field)
490
- rfbFtpSProtocolEnabled = 1 ' for rfbFtpAbortFileTransfer
494
+
495
+ ' Size param - rfbFtpAbortFileTransfer
496
+ rfbFtpSProtocolEnabled = 1
491
497
rfbFtpSProtocolDisabled = -1
492
- rfbFtpSPacketUncompressed = 0 ' for rfbFtpFilePacket
498
+
499
+ ' Size param - rfbFtpFilePacket
500
+ rfbFtpSPacketUncompressed = 0
493
501
rfbFtpSPacketCompressed = 1
494
502
rfbFtpSPacketAlreadyThere = 2
495
503
End Enum
@@ -1731,7 +1739,7 @@ Private Function pvSendFileTransferFileContent(uOutput As UcsBuffer, pStream As
1731
1739
On Error GoTo EH
1732
1740
ReDim baBuffer(0 To rfbFtpProtocolPacketSize - 1 ) As Byte
1733
1741
Do While Not m_oSocket.HasPendingEvent
1734
- If pvCheckHResult(IStream_Read(pStream, pvArrayPtr(baBuffer), pvArraySize(baBuffer), lRead)) < 0 Then
1742
+ If pvCheckHResult(IStream_Read(pStream, pvArrayPtr(baBuffer), pvArraySize(baBuffer), lRead), FUNC_NAME ) < 0 Then
1735
1743
If Not pvSendFileTransfer(uOutput, rfbFtpAbortFileTransfer) Then
1736
1744
GoTo QH
1737
1745
End If
@@ -1749,7 +1757,7 @@ Cleanup:
1749
1757
End If
1750
1758
If pChecksums Is Nothing Then
1751
1759
lChecksum = 0
1752
- ElseIf IStream_Read(pChecksums, VarPtr(lChecksum), 4 ) < 0 Then
1760
+ ElseIf IStream_Read(pChecksums, VarPtr(lChecksum), 4 ) < 0 Then '-- don't check hResult
1753
1761
lChecksum = 0
1754
1762
Set pChecksums = Nothing
1755
1763
ElseIf lChecksum <> pvCalcAdler32(1 , baBuffer, 0 , lRead) Then
@@ -1797,6 +1805,8 @@ Private Function pvHandleFileTransfer(uOutput As UcsBuffer, uMsg As RfbFileTrans
1797
1805
Dim sFile As String
1798
1806
Dim lBufferSize As Long
1799
1807
Dim bDelaySend As Boolean
1808
+ Dim aChecksum() As Long
1809
+ Dim pStream As stdole .IUnknown
1800
1810
1801
1811
On Error GoTo EH
1802
1812
If uMsg.ContentType <> rfbFtpFilePacket And uMsg.ContentType <> rfbFtpFileChecksums Then
@@ -1934,9 +1944,9 @@ Private Function pvHandleFileTransfer(uOutput As UcsBuffer, uMsg As RfbFileTrans
1934
1944
#End If
1935
1945
If SHCreateStreamOnFile(StrPtr(sPath), STGM_READ, m_pFtpSendStream) < 0 Then
1936
1946
cStreamSize = ERROR_VALUE
1937
- ElseIf pvCheckHResult(IStream_Seek(m_pFtpSendStream, 0 , STREAM_SEEK_END, cStreamSize)) < 0 Then
1947
+ ElseIf pvCheckHResult(IStream_Seek(m_pFtpSendStream, 0 , STREAM_SEEK_END, cStreamSize), FUNC_NAME ) < 0 Then
1938
1948
cStreamSize = ERROR_VALUE
1939
- ElseIf pvCheckHResult(IStream_Seek(m_pFtpSendStream, 0 , STREAM_SEEK_SET)) < 0 Then
1949
+ ElseIf pvCheckHResult(IStream_Seek(m_pFtpSendStream, 0 , STREAM_SEEK_SET), FUNC_NAME ) < 0 Then
1940
1950
cStreamSize = ERROR_VALUE
1941
1951
Else
1942
1952
sPath = sPath & "," & Format$(pvGetFileDateTime(sPath), FORMAT_FILEDATETIME)
@@ -1960,7 +1970,33 @@ Private Function pvHandleFileTransfer(uOutput As UcsBuffer, uMsg As RfbFileTrans
1960
1970
End If
1961
1971
Case rfbFtpFileTransferOffer
1962
1972
m_sFtpRecvFileName = Split(sPath, "," , Limit:=2 )(0 )
1963
- If pvCheckHResult(pvCreateStreamOnFile(m_sFtpRecvFileName, STGM_WRITE Or STGM_CREATE, m_pFtpRecvStream)) < 0 Then
1973
+ If pvCreateStreamOnFile(m_sFtpRecvFileName, STGM_READ, pStream) < 0 Then '--- don't check hResult
1974
+ GoTo SkipChecksums
1975
+ End If
1976
+ If pvCheckHResult(IStream_Seek(pStream, 0 , STREAM_SEEK_END, cStreamSize), FUNC_NAME) < 0 Then
1977
+ GoTo SkipChecksums
1978
+ End If
1979
+ cStreamSize = cStreamSize * 10000 @
1980
+ If pvCheckHResult(IStream_Seek(pStream, 0 , STREAM_SEEK_SET), FUNC_NAME) < 0 Then
1981
+ GoTo SkipChecksums
1982
+ End If
1983
+ ReDim baBuffer(0 To rfbFtpProtocolPacketSize - 1 ) As Byte
1984
+ ReDim aChecksum(0 To Int((cStreamSize + rfbFtpProtocolPacketSize - 1 ) / rfbFtpProtocolPacketSize)) As Long
1985
+ For lIdx = 0 To UBound(aChecksum)
1986
+ If IStream_Read(pStream, pvArrayPtr(baBuffer), pvArraySize(baBuffer), lSize) < 0 Or lSize = 0 Then '--- don't check hResult
1987
+ Exit For
1988
+ End If
1989
+ aChecksum(lIdx) = pvCalcAdler32(1 , baBuffer, 0 , lSize)
1990
+ Next
1991
+ If lIdx > 0 Then
1992
+ If Not pvSendFileTransfer(uOutput, rfbFtpFileChecksums, Ptr:=VarPtr(aChecksum(0 )), Size:=lIdx * 4 ) Then
1993
+ GoTo QH
1994
+ End If
1995
+ End If
1996
+ SkipChecksums:
1997
+ lIdx = IIf (pStream Is Nothing , STGM_CREATE, 0 )
1998
+ Set pStream = Nothing
1999
+ If pvCheckHResult(pvCreateStreamOnFile(m_sFtpRecvFileName, STGM_WRITE Or lIdx, m_pFtpRecvStream), FUNC_NAME) < 0 Then
1964
2000
eStatus = rfbFtpSErrorCmd
1965
2001
End If
1966
2002
baBuffer = StrConv(m_sFtpRecvFileName, vbFromUnicode, GetSystemDefaultLCID())
@@ -1969,13 +2005,55 @@ Private Function pvHandleFileTransfer(uOutput As UcsBuffer, uMsg As RfbFileTrans
1969
2005
GoTo QH
1970
2006
End If
1971
2007
Case rfbFtpFilePacket
1972
- If IStream_Write(m_pFtpRecvStream, pvArrayPtr(baData), pvArraySize(baData)) < 0 Then
1973
- If Not pvSendFileTransfer(uOutput, rfbFtpAbortFileTransfer) Then
1974
- GoTo QH
2008
+ If m_pFtpRecvStream Is Nothing Then
2009
+ GoTo QH
2010
+ End If
2011
+ If uMsg.Size = rfbFtpSPacketAlreadyThere Then
2012
+ If pvCheckHResult(IStream_Seek(m_pFtpRecvStream, uMsg.Length / 10000 @, STREAM_SEEK_CUR), FUNC_NAME) < 0 Then
2013
+ GoTo AbortRecv
2014
+ End If
2015
+ ElseIf uMsg.Size = rfbFtpSPacketCompressed Then
2016
+ #If ImplZlib Then
2017
+ Dim hCtx As Long
2018
+ Dim lOutputPtr As Long
2019
+ Dim lOutputSize As Long
2020
+ With New cZipArchive
2021
+ hCtx = .InflateInit()
2022
+ '--- skip prefix (2 bytes zlib header) and suffix (4 bytes adler32 checksum)
2023
+ .InflateBlob hCtx, VarPtr(baData(2 )), pvArraySize(baData) - 2 - 4 , lOutputPtr, lOutputSize
2024
+ .InflateEnd hCtx
2025
+ If lOutputSize = 0 Then
2026
+ GoTo AbortRecv
2027
+ End If
2028
+ ReDim baData(0 To lOutputSize - 1 ) As Byte
2029
+ Call CopyMemory (baData(0 ), ByVal lOutputPtr, lOutputSize)
2030
+ Call CoTaskMemFree (lOutputPtr)
2031
+ End With
2032
+ #Else
2033
+ #If ImplUseDebugLog Then
2034
+ DebugLog MODULE_NAME, FUNC_NAME, "Compression not compiled (VNC_NO_ZLIB = 1)" , vbLogEventTypeError
2035
+ #End If
2036
+ GoTo AbortRecv
2037
+ #End If
2038
+ uMsg.Size = rfbFtpSPacketUncompressed
2039
+ End If
2040
+ If uMsg.Size = rfbFtpSPacketUncompressed Then
2041
+ If pvCheckHResult(IStream_Write(m_pFtpRecvStream, pvArrayPtr(baData), pvArraySize(baData)), FUNC_NAME) < 0 Then
2042
+ AbortRecv:
2043
+ Set m_pFtpRecvStream = Nothing
2044
+ If Not pvSendFileTransfer(uOutput, rfbFtpAbortFileTransfer) Then
2045
+ GoTo QH
2046
+ End If
1975
2047
End If
1976
2048
End If
1977
2049
Case rfbFtpEndOfFile
2050
+ If pvCheckHResult(IStream_Seek(m_pFtpRecvStream, 0 , STREAM_SEEK_CUR, cStreamSize), FUNC_NAME) < 0 Then
2051
+ cStreamSize = -1
2052
+ End If
1978
2053
Set m_pFtpRecvStream = Nothing
2054
+ If cStreamSize >= 0 Then
2055
+ SetFileLen m_sFtpRecvFileName, cStreamSize * 10000 @
2056
+ End If
1979
2057
#If ImplZlib Then
1980
2058
If Right$(m_sFtpRecvFileName, sizeof_ZIP_SUFFIX) = STR_ZIP_SUFFIX Then
1981
2059
sPath = Mid$(m_sFtpRecvFileName, InStrRev(m_sFtpRecvFileName, "\" ) + 1 )
@@ -2082,15 +2160,15 @@ Private Function pvHandleTightFileTransfer(uOutput As UcsBuffer, uMsg As UcsTigh
2082
2160
pvBufferWriteBlob uOutput, pvArrayPtr(uList.Data), uList.Size
2083
2161
Case rfbMsgTightUploadStartRequest
2084
2162
sFile = Mid$(uMsg.Path, 2 )
2085
- If pvCheckHResult(pvCreateStreamOnFile(sFile, STGM_WRITE Or IIf ((uMsg.Flags And 1 ) <> 0 , STGM_CREATE, 0 ), m_pFtpRecvStream)) < 0 Then
2163
+ If pvCheckHResult(pvCreateStreamOnFile(sFile, STGM_WRITE Or IIf ((uMsg.Flags And 1 ) <> 0 , STGM_CREATE, 0 ), m_pFtpRecvStream), FUNC_NAME ) < 0 Then
2086
2164
GoTo Failed
2087
2165
End If
2088
- If pvCheckHResult(IStream_Seek(m_pFtpRecvStream, uMsg.Offset, STREAM_SEEK_SET)) < 0 Then
2166
+ If pvCheckHResult(IStream_Seek(m_pFtpRecvStream, uMsg.Offset, STREAM_SEEK_SET), FUNC_NAME ) < 0 Then
2089
2167
GoTo Failed
2090
2168
End If
2091
2169
pvBufferWriteLong uOutput, rfbMsgTightUploadStartReply, Size:=4
2092
2170
Case rfbMsgTightUploadDataRequest
2093
- If pvCheckHResult(IStream_Write(m_pFtpRecvStream, pvArrayPtr(baData), pvArraySize(baData))) < 0 Then
2171
+ If pvCheckHResult(IStream_Write(m_pFtpRecvStream, pvArrayPtr(baData), pvArraySize(baData)), FUNC_NAME ) < 0 Then
2094
2172
GoTo Failed
2095
2173
End If
2096
2174
pvBufferWriteLong uOutput, rfbMsgTightUploadDataReply, Size:=4
@@ -2099,16 +2177,16 @@ Private Function pvHandleTightFileTransfer(uOutput As UcsBuffer, uMsg As UcsTigh
2099
2177
pvBufferWriteLong uOutput, rfbMsgTightUploadEndReply, Size:=4
2100
2178
Case rfbMsgTightDownloadStartRequest
2101
2179
m_sFtpRecvFileName = Mid(uMsg.Path, 2 )
2102
- If pvCheckHResult(pvCreateStreamOnFile(m_sFtpRecvFileName, STGM_READ, m_pFtpSendStream)) < 0 Then
2180
+ If pvCheckHResult(pvCreateStreamOnFile(m_sFtpRecvFileName, STGM_READ, m_pFtpSendStream), FUNC_NAME ) < 0 Then
2103
2181
GoTo Failed
2104
2182
End If
2105
- If pvCheckHResult(IStream_Seek(m_pFtpSendStream, uMsg.Offset, STREAM_SEEK_SET)) < 0 Then
2183
+ If pvCheckHResult(IStream_Seek(m_pFtpSendStream, uMsg.Offset, STREAM_SEEK_SET), FUNC_NAME ) < 0 Then
2106
2184
GoTo Failed
2107
2185
End If
2108
2186
pvBufferWriteLong uOutput, rfbMsgTightDownloadStartReply, Size:=4
2109
2187
Case rfbMsgTightDownloadDataRequest
2110
2188
pvArrayAllocate baBuffer, Clamp(uMsg.DataSize, , 2 ^ 20 ), FUNC_NAME & ".baBuffer"
2111
- If pvCheckHResult(IStream_Read(m_pFtpSendStream, pvArrayPtr(baBuffer), pvArraySize(baBuffer), lSize)) < 0 Then
2189
+ If pvCheckHResult(IStream_Read(m_pFtpSendStream, pvArrayPtr(baBuffer), pvArraySize(baBuffer), lSize), FUNC_NAME ) < 0 Then
2112
2190
GoTo Failed
2113
2191
End If
2114
2192
If lSize = 0 Then
@@ -2839,14 +2917,14 @@ Private Function pvCaptureSend(uFrame As UcsCaptureFrame, uOutput As UcsBuffer)
2839
2917
#If ImplUseDebugLog Then
2840
2918
sDebugInfo = sDebugInfo & " H=" & Format$(cTemp, "0.00" ) & " QL=" & lQualityLevel
2841
2919
#End If
2842
- If pvCheckHResult(IStream_Seek(m_pImageStream, 0 , STREAM_SEEK_SET)) < 0 Then
2920
+ If pvCheckHResult(IStream_Seek(m_pImageStream, 0 , STREAM_SEEK_SET), FUNC_NAME ) < 0 Then
2843
2921
GoTo QH
2844
2922
End If
2845
2923
If Not pvWicConvertImage(m_pImageStream, m_aWicFormatJpeg, Clamp(lQualityLevel, 1 , 100 ), _
2846
2924
uTile.Data, .Tiles(lIdx).Width, .Tiles(lIdx).Height, m_aWicFormat32bppBGR) Then
2847
2925
GoTo QH
2848
2926
End If
2849
- If pvCheckHResult(IStream_Seek(m_pImageStream, 0 , STREAM_SEEK_CUR, cTemp)) < 0 Then
2927
+ If pvCheckHResult(IStream_Seek(m_pImageStream, 0 , STREAM_SEEK_CUR, cTemp), FUNC_NAME ) < 0 Then
2850
2928
GoTo QH
2851
2929
End If
2852
2930
lSize = cTemp * 10000
@@ -3081,43 +3159,43 @@ Private Function pvWicConvertImage( _
3081
3159
Dim aBag(0 To 7 ) As Long
3082
3160
3083
3161
On Error GoTo EH
3084
- If pvCheckHResult(IWICImagingFactory_CreateBitmapFromMemory_Proxy(m_pWicFactory, lWidth, lHeight, aPixelFormat(0 ), lWidth * 4 , UBound(baInput) + 1 , baInput(0 ), pBitmap)) < 0 Then
3162
+ If pvCheckHResult(IWICImagingFactory_CreateBitmapFromMemory_Proxy(m_pWicFactory, lWidth, lHeight, aPixelFormat(0 ), lWidth * 4 , UBound(baInput) + 1 , baInput(0 ), pBitmap), FUNC_NAME ) < 0 Then
3085
3163
GoTo QH
3086
3164
End If
3087
- If pvCheckHResult(IWICImagingFactory_CreateStream_Proxy(m_pWicFactory, pWicStream)) < 0 Then
3165
+ If pvCheckHResult(IWICImagingFactory_CreateStream_Proxy(m_pWicFactory, pWicStream), FUNC_NAME ) < 0 Then
3088
3166
GoTo QH
3089
3167
End If
3090
- If pvCheckHResult(IWICStream_InitializeFromIStream_Proxy(pWicStream, pOutput)) < 0 Then
3168
+ If pvCheckHResult(IWICStream_InitializeFromIStream_Proxy(pWicStream, pOutput), FUNC_NAME ) < 0 Then
3091
3169
GoTo QH
3092
3170
End If
3093
- If pvCheckHResult(IWICImagingFactory_CreateEncoder_Proxy(m_pWicFactory, aContainerFormat(0 ), ByVal 0 , pEncoder)) < 0 Then
3171
+ If pvCheckHResult(IWICImagingFactory_CreateEncoder_Proxy(m_pWicFactory, aContainerFormat(0 ), ByVal 0 , pEncoder), FUNC_NAME ) < 0 Then
3094
3172
GoTo QH
3095
3173
End If
3096
- If pvCheckHResult(IWICBitmapEncoder_Initialize_Proxy(pEncoder, pWicStream, WICBitmapEncoderNoCache)) < 0 Then
3174
+ If pvCheckHResult(IWICBitmapEncoder_Initialize_Proxy(pEncoder, pWicStream, WICBitmapEncoderNoCache), FUNC_NAME ) < 0 Then
3097
3175
GoTo QH
3098
3176
End If
3099
- If pvCheckHResult(IWICBitmapEncoder_CreateNewFrame_Proxy(pEncoder, pFrame, pPropBag)) < 0 Then
3177
+ If pvCheckHResult(IWICBitmapEncoder_CreateNewFrame_Proxy(pEncoder, pFrame, pPropBag), FUNC_NAME ) < 0 Then
3100
3178
GoTo QH
3101
3179
End If
3102
3180
If lImageQuality <> 0 Then
3103
3181
aBag(3 ) = StrPtr("ImageQuality" )
3104
- If pvCheckHResult(IPropertyBag2_Write_Proxy(pPropBag, 1 , aBag(0 ), CSng(lImageQuality) / 100 !)) < 0 Then
3182
+ If pvCheckHResult(IPropertyBag2_Write_Proxy(pPropBag, 1 , aBag(0 ), CSng(lImageQuality) / 100 !), FUNC_NAME ) < 0 Then
3105
3183
GoTo QH
3106
3184
End If
3107
3185
End If
3108
- If pvCheckHResult(IWICBitmapFrameEncode_Initialize_Proxy(pFrame, pPropBag)) < 0 Then
3186
+ If pvCheckHResult(IWICBitmapFrameEncode_Initialize_Proxy(pFrame, pPropBag), FUNC_NAME ) < 0 Then
3109
3187
GoTo QH
3110
3188
End If
3111
- If pvCheckHResult(IWICBitmapFrameEncode_SetSize_Proxy(pFrame, lWidth, lHeight)) < 0 Then
3189
+ If pvCheckHResult(IWICBitmapFrameEncode_SetSize_Proxy(pFrame, lWidth, lHeight), FUNC_NAME ) < 0 Then
3112
3190
GoTo QH
3113
3191
End If
3114
- If pvCheckHResult(IWICBitmapFrameEncode_WriteSource_Proxy(pFrame, pBitmap, ByVal 0 )) < 0 Then
3192
+ If pvCheckHResult(IWICBitmapFrameEncode_WriteSource_Proxy(pFrame, pBitmap, ByVal 0 ), FUNC_NAME ) < 0 Then
3115
3193
GoTo QH
3116
3194
End If
3117
- If pvCheckHResult(IWICBitmapFrameEncode_Commit_Proxy(pFrame)) < 0 Then
3195
+ If pvCheckHResult(IWICBitmapFrameEncode_Commit_Proxy(pFrame), FUNC_NAME ) < 0 Then
3118
3196
GoTo QH
3119
3197
End If
3120
- If pvCheckHResult(IWICBitmapEncoder_Commit_Proxy(pEncoder)) < 0 Then
3198
+ If pvCheckHResult(IWICBitmapEncoder_Commit_Proxy(pEncoder), FUNC_NAME ) < 0 Then
3121
3199
GoTo QH
3122
3200
End If
3123
3201
'--- success
@@ -3128,18 +3206,16 @@ EH:
3128
3206
PrintError FUNC_NAME
3129
3207
End Function
3130
3208
3131
- Private Function pvCheckHResult (ByVal hResult As Long , Optional vErrSource As Variant ) As Long
3132
- Const FUNC_NAME As String = "pvCheckHResult"
3133
-
3209
+ Private Function pvCheckHResult (ByVal hResult As Long , sFunction As String ) As Long
3134
3210
On Error GoTo EH
3135
3211
If hResult < 0 Then
3136
- Err.Raise hResult, vErrSource
3212
+ Err.Raise hResult
3137
3213
End If
3138
3214
QH:
3139
3215
pvCheckHResult = hResult
3140
3216
Exit Function
3141
3217
EH:
3142
- PrintError IIf (IsMissing(vErrSource), FUNC_NAME, vErrSource)
3218
+ PrintError sFunction
3143
3219
Resume QH
3144
3220
End Function
3145
3221
@@ -3334,19 +3410,20 @@ Private Sub pvBufferWriteCurrency(uOutput As UcsBuffer, cValue As Currency)
3334
3410
End Sub
3335
3411
3336
3412
Private Sub pvBufferWriteStream (uOutput As UcsBuffer , pStream As stdole .IUnknown)
3413
+ Const FUNC_NAME As String = "pvBufferWriteStream"
3337
3414
Dim cTemp As Currency
3338
3415
Dim lSize As Long
3339
3416
3340
- If pvCheckHResult(IStream_Seek(pStream, 0 , STREAM_SEEK_CUR, cTemp)) < 0 Then
3417
+ If pvCheckHResult(IStream_Seek(pStream, 0 , STREAM_SEEK_CUR, cTemp), FUNC_NAME ) < 0 Then
3341
3418
GoTo QH
3342
3419
End If
3343
3420
lSize = cTemp * 10000
3344
3421
If lSize > 0 Then
3345
3422
pvBufferWriteBlob uOutput, 0 , lSize
3346
- If pvCheckHResult(IStream_Seek(pStream, 0 , STREAM_SEEK_SET)) < 0 Then
3423
+ If pvCheckHResult(IStream_Seek(pStream, 0 , STREAM_SEEK_SET), FUNC_NAME ) < 0 Then
3347
3424
GoTo QH
3348
3425
End If
3349
- If pvCheckHResult(IStream_Read(pStream, VarPtr(uOutput.Data(uOutput.Size - lSize)), lSize)) < 0 Then
3426
+ If pvCheckHResult(IStream_Read(pStream, VarPtr(uOutput.Data(uOutput.Size - lSize)), lSize), FUNC_NAME ) < 0 Then
3350
3427
GoTo QH
3351
3428
End If
3352
3429
End If
@@ -3703,6 +3780,25 @@ End Property
3703
3780
Private Function Zn (sText As String , Optional IfEmptyString As Variant = Null , Optional EmptyString As String ) As Variant
3704
3781
Zn = IIf (sText = EmptyString, IfEmptyString, sText)
3705
3782
End Function
3783
+
3784
+ Private Function SetFileLen (sFile As String , ByVal cFileSize As Currency , Optional ByVal Exclusive As Boolean ) As Boolean
3785
+ Const GENERIC_WRITE As Long = &H40000000
3786
+ Const OPEN_EXISTING As Long = 3
3787
+ Const FILE_SHARE_READ As Long = &H1
3788
+ Const FILE_BEGIN As Long = 0
3789
+ Dim hFile As Long
3790
+
3791
+ hFile = CreateFile(StrPtr(sFile), GENERIC_WRITE, IIf (Exclusive, 0 , FILE_SHARE_READ), 0 , OPEN_EXISTING, 0 , 0 )
3792
+ If hFile <> 0 Then
3793
+ If SetFilePointerEx(hFile, cFileSize / 10000 @, 0 , FILE_BEGIN) <> 0 Then
3794
+ If SetEndOfFile(hFile) <> 0 Then
3795
+ '--- success
3796
+ SetFileLen = True
3797
+ End If
3798
+ End If
3799
+ Call CloseHandle (hFile)
3800
+ End If
3801
+ End Function
3706
3802
#End If
3707
3803
3708
3804
'=========================================================================
0 commit comments