Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / WideCharToMultiByte для 64 битного / 7 сообщений из 7, страница 1 из 1
15.09.2017, 12:41
    #39521762
f2f
f2f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte для 64 битного
Добрый день

Использовал раньше в 32 разрядном Accsess функцию WideCharToMultiByte для перевода строк в utf8

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As LongPtr, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As LongPtr, _
    ByVal cbMultiByte As Long, _
    ByVal lpDefaultChar As LongPtr, _
    ByVal lpUsedDefaultChar As LongPtr) As LongPtr
    
Private Const CP_UTF8 = 65001


Public Function StringtoUTF8(ByVal Src As String) As String
    Dim SrcLng As Long
    Dim DstLng As Long
    Dim Dst() As Byte
    Dim I As Long
    
    SrcLng = Len(Src)
    If SrcLng <> 0 Then
        DstLng = WideCharToMultiByte(CP_UTF8, 0, StrPtr(Src), SrcLng, 0, 0, 0, 0)
        If DstLng > 0 Then
            ReDim Dst(DstLng - 1)
            DstLng = WideCharToMultiByte(CP_UTF8, 0, StrPtr(Src), SrcLng, VarPtr(Dst(0)), DstLng, 0, 0)
           
            StringtoUTF8 = String(DstLng, " ")
            For I = 0 To UBound(Dst)
                Mid(StringtoUTF8, I + 1, 1) = Chr(Dst(I))
            Next
        End If
    End If
End Function



Но в 64 разрядном это не работает, а внезапно потребовалось.

Кто-нибудь работает с 64 разрядным? Подскажите, что нужно поменять?
...
Рейтинг: 0 / 0
15.09.2017, 13:49
    #39521849
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte для 64 битного
f2f,

вечером могу глянуть,
сейчас вижу, что WideCharToMultiByte у вас возвращает LongPtr, а потом вы это значение присваиваете переменной с типом Long.
Проверьте, может в этом дело.
...
Рейтинг: 0 / 0
15.09.2017, 17:58
    #39522023
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte для 64 битного
f2f,
Кроме использования апишной функции есть и другой вариант (здесь на форуме уже как-то давали ссылку), посмотрите , может и пригодится
http://excelvba.ru/code/Encode
...
Рейтинг: 0 / 0
15.09.2017, 18:10
    #39522025
f2f
f2f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte для 64 битного
Вакшуль Сергей,

Спасибо, добрый человек! Заработало!
Я уже голову сломал пытаясь понять в каких указателях запутался, а про результат функции забыл... :(
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.09.2021, 00:02
    #40099440
Dm13_13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte для 64 битного
Вакшуль Сергей,

добрый день. Столкнулся с аналогичной проблемой. При выполнении ругается на ошибку компиляции. Несоответствие типов StrPtr. Уже все перепробовал. Подскажите, пожалуйста, что надо подправить, чтобы заработало? Код не мой, а сейчас возникла необходимость перейти на 64 битный офис.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Declare PtrSafe 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

Public Function DecodeUTF8(ByVal sInput As String) As String
Dim iStrSize As Long, lMaxSize As Long, str1 As String
Dim p As Long
Dim str2 As String
    If Len(sInput) = 0 Then Exit Function
    lMaxSize = Len(sInput)
    str1 = String$(lMaxSize, 0&)
    iStrSize = MultiByteToWideChar(65001, 0&, sInput, &HFFFF, StrPtr(str1), lMaxSize)
    If iStrSize > 0 Then
        DecodeUTF8 = Left$(str1, iStrSize - 1)
    Else
        DecodeUTF8 = sInput
    End If
End Function
...
Рейтинг: 0 / 0
23.09.2021, 01:19
    #40099441
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte для 64 битного
Dm13_13,
я этим, честно говоря, и не занимаюсь..
ну у вас там тоже не совпадают типы.

Попробуйте заменить
ByVal lpWideCharStr As Long
на
ByVal lpWideCharStr As LongPtr

вроде работает.
...
Рейтинг: 0 / 0
23.09.2021, 09:43
    #40099470
Dm13_13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte для 64 битного
Вакшуль Сергей,

Спасибо Вам большое. Помогло
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / WideCharToMultiByte для 64 битного / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]