Поддержка Unicode в VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поддержка Unicode в VB

Сообщение Хакер » 26.07.2012 (Чт) 21:50

Так в пруф-примере он и продемонстрирован. MessageBox объявлена с аргументами не As String, а As Long, и передаётся StrPtr. И в итоге имеем в пруф-примере, что все юникодные части строки выводятся как надо. Хоть где.

Конечно мы уверены в этом. На все сто.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Поддержка Unicode в VB

Сообщение ger_kar » 26.07.2012 (Чт) 22:00

vip.fedor писал(а):Спасибо, но Вы уверенны что это работает?
Это работает! И в теории и в практике, а теория здесь такая:
При передаче строки, (если точнее, то передается указатель на эту строку) при традиционном объявлении VB предварительно конвертирует эту строку в ANSI и передает неюникодной функции указатель на конвертированную строку, а после вызова производит обратную конвертацию. Так вот задача сводится к тому, что-бы избежать этой конвертации и реализуется она следующим образом. В объявлении Declare в ключевом слове Alias указывается юникодный вариант функции с (W), а вместо ByRef Str As String указывается ByVal pStr As Long. А при вызове указывается StrPtr(Str). Таким образом вызываемой функции сразу передается указатель на строку без лишних конвертаций, что собственно и нужно и что собственно и написал iGrok.

PS. Пока писал, Хакер успел ответить раньше :)
Бороться и искать, найти и перепрятать

vip.fedor
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 23.07.2012 (Пн) 5:04

Re: Поддержка Unicode в VB

Сообщение vip.fedor » 27.07.2012 (Пт) 16:45

Прошу помочь разобраться на примере с функцией SHGetFolderPath и ее Unicode Alias "SHGetFolderPathW".
Третий час сижу над примером Хакера и пытаюсь связать одно с другим - ничего не выходит. Видимо, моих знаний недостаточно для борьбы с этим преобразованиями. Если проблема реально решается - предоставьте, пожалуйста, решение. Тут кода очень немного, не думаю что для человека понимающего логику преобразований займет более 10 минут. Я реально замотался с этим уже. Готов уже бросить всю эту затею и пойти путем наименьшего сопротивления, но ваши слова о том, что "истина где-то рядом" не дают покоя =) Буду благодарен за любую помощь! Спасибо!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поддержка Unicode в VB

Сообщение Хакер » 27.07.2012 (Пт) 17:37

Скажи с какимипараметрами тебе надо вызвать SHGetFolderPath. CSIDL и тому подобное. Сделаю пример, если не долго.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vip.fedor
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 23.07.2012 (Пн) 5:04

Re: Поддержка Unicode в VB

Сообщение vip.fedor » 27.07.2012 (Пт) 18:01

Хакер писал(а):Скажи с какимипараметрами тебе надо вызвать SHGetFolderPath. CSIDL и тому подобное.


Спасибо!
'All Users\Documents
CSIDL = &H2E

Ниже часть кода, которая нормально работает при Non-Unicode = кириллице (нужен аналог в Unicode, который будет возвращать корректный путь независимо от Non-Unicode значения).

Код: Выделить всё
Private Declare Function SHGetFolderPath Lib "shell32.dll" Alias "SHGetFolderPathA" (ByVal hwndOwner As Long, ByVal nFolder As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal lpszPath As String) As Long

Private Const S_OK = &H0
Private Const S_FALSE = &H1
Private Const E_INVALIDARG = &H80070057
Private Const SHGFP_TYPE_CURRENT = 0
Private Const SHGFP_TYPE_DEFAULT = 1

Public Function GetDocFolder() As String

    Dim strBuffer As String * 1000
    Dim strPath As String
    Dim lngReturn As Long
   
    lngReturn = SHGetFolderPath(0&, &H2E, 0&, SHGFP_TYPE_CURRENT, strBuffer)
   
    If lngReturn = S_OK Then
        strPath = Left$(strBuffer, InStr(strBuffer, Chr$(0)) - 1)
    Else
        MsgBox "Error!", vbCritical, "App"
    End If
   
    GetDocFolder = strPath
   
End Function

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поддержка Unicode в VB

Сообщение Хакер » 28.07.2012 (Сб) 13:52

Готово. Что сложного?
Вложения
unicode_csidl_to_path.zip
Получение пути по CSIDL-у без потери юникодных символов по пути.
(1.77 Кб) Скачиваний: 110
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vip.fedor
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 23.07.2012 (Пн) 5:04

Re: Поддержка Unicode в VB

Сообщение vip.fedor » 29.07.2012 (Вс) 16:43

Подтверждаю, все отлично работает! Спасибо за помощь.

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 48

    TopList