Пожалуйста, помогите устранить зависание в UTF-8->Win1251 перекодировщике.
Код
- Код: Выделить всё
Private Declare Function LocalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal wBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Const CP_UTF8 As Long = 65001
Private Const LMEM_ZEROINIT As Long = &H40
Private Function UTF8ToWin(ByRef inString As String, _
ByVal lMaxSize As Long) As String
Dim hMemLock1 As Long, hMemLock2 As Long
Dim iStrSize As Long
hMemLock1 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
hMemLock2 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
iStrSize = MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, hMemLock1, lMaxSize)
iStrSize = WideCharToMultiByte(0&, 0&, hMemLock1, &HFFFF, hMemLock2, iStrSize, 0&, 0&)
If Len(iStrSize) Then
UTF8ToWin = String$(iStrSize, 0&)
Call CopyMemory(ByVal UTF8ToWin, ByVal hMemLock2, iStrSize)
End If
Call LocalFree(hMemLock1)
Call LocalFree(hMemLock2)
End Function
Private Sub Form_Load()
Dim inString As String
inString = "Т1 ООО 759.xls"
outstring = UTF8ToWin(inString, Len(inString))
MsgBox outstring
End
End Sub
нашел в Интернете. Корректно работает с кириллицей. Но вот если начать менять значение 'inString' (в UTF-8) на другое (ну, просто - было любое одно, меняем на любое другое) - приложение выдает ошибку, виснет. Подозреваю, что проблема в использовании памяти, но как её устранить - не знаю.
Перекодировщик будет использоваться в почтовой программе после перекодировщика из Base64.
Кракозябры в 'inString = "Т1 ООО 759.xls"' возникли в результате копирования (это кириллица). А так здесь текст в UTF-8.
Пожалуйста, помогите.
Спасибо.