powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / WideCharToMultiByte для 64 битного
7 сообщений из 7, страница 1 из 1
WideCharToMultiByte для 64 битного
    #39521762
f2f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f2f
Гость
Добрый день

Использовал раньше в 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
WideCharToMultiByte для 64 битного
    #39521849
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f2f,

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

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

добрый день. Столкнулся с аналогичной проблемой. При выполнении ругается на ошибку компиляции. Несоответствие типов 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
WideCharToMultiByte для 64 битного
    #40099441
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dm13_13,
я этим, честно говоря, и не занимаюсь..
ну у вас там тоже не совпадают типы.

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

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

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


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