35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
1

Передача unicode строки в библиотеку VB

27.01.2015, 13:10. Показов 1627. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Поменял в проекте кодировку на Unicode. Теперь библиотека VB принимает пустые строки.
Что можно сделать?
Может как-то передавать строку в обычной кодировке? Но такой способ в самом PB дает пустую строку:
PureBasic
1
2
Text.s = "Текст"
Text2.s = PeekS(@*Text, -1, #PB_Unicode)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2015, 13:10
Ответы с готовыми решениями:

Передача Unicode-строки в функцию по ссылке
Добрый день, товарищи форумчане. Я столкнулся с такой вот задачей: Есть некая функция, например, ...

Передача Unicode-строки через сокет. Видимо что-то случилось...
Добрый день! Пытаюсь написать простенькое клиент-серверное приложение - сервер слушает какой-либо...

Передача объекта в библиотеку
У меня в проге есть форма и библиотека, на форме расположен грид VSFlexgrid. Библиотека отвечает за...

Передача констант через динамически подгружаемую библиотеку
Всем привет! Создал LS-библиотеку, общую для нескольких баз системы. Специфику же каждой базы...

12
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
27.01.2015, 13:25 2
Если проект юникодный, то строку не нужно перекодировать, ведь она и так в юникоде. Возможно в VB какие-то нестандартные юникодные стоки. Возможно BSTR. PB поддерживает этот тип строки (в прототипах, интерфейсах и импорте) через псевдотип p-bstr.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
27.01.2015, 14:22  [ТС] 3
locm, не понятно. Что делать с этим? Как мне передать строку p-bstr, как вообще создать такую переменную? Если в примере по вашей ссылке всего лишь импорт готовой функции. По моему, этот пример вообще бесполезен.

До этого я пользовался функцией, для преобразования в bstr:
PureBasic
1
2
3
4
5
6
7
8
9
10
Procedure.l ansi2bstr(ansi.s)
  size.l=MultiByteToWideChar_(#CP_ACP,0,ansi,Len(ansi),0,0)
  Dim unicode.w(size)
  MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size);#CP_ACP
  For i=0 To size
        tmp.s + Hex(unicode(i),#PB_Unicode)
        Next
  ;MessageRequester(Str(size), tmp )
  ProcedureReturn SysAllocString_(@unicode())
EndProcedure
А как её переделать под юникод?
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
27.01.2015, 14:30 4
Цитата Сообщение от Randen Посмотреть сообщение
всего лишь импорт готовой функции.
Разве из библиотеки на VB не импортируется функция?
Покажите код вызова этой функции.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
27.01.2015, 14:32  [ТС] 5
locm, кажется понял. Я вызваю Call методом. Но щас что-нибудь придумаю)
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
27.01.2015, 14:41 6
Нужно вызывать через прототип.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
27.01.2015, 14:45  [ТС] 7
Не получается.
PureBasic
1
2
3
Import "тут полный путь до *.lib файла"
  DocumentOpen(Word.l, Path.p-bstr)
EndImport
Пишет ошибку unresolved external symbol '_DocumentOpen'
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
27.01.2015, 14:50 8
Возможно в lib-файле другое имя у функции. Его нужно открыть в каком-то hex-просмоторщике (в крайнем случае, перетащить lib-файл в окно редактора PB) и посмотреть какое у функции имя.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
27.01.2015, 14:53  [ТС] 9
locm, а можно вместо импорта прототип использовать?
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
27.01.2015, 14:58 10
Можно.
PureBasic
1
2
3
4
5
Prototype DocumentOpen(Word.l, Path.p-bstr)
If OpenLibrary(0, "VB_Lib.dll")
  DocumentOpen.DocumentOpen = GetFunction(0, "DocumentOpen")
  DocumentOpen(0, "С:\1234.doc")
EndIf
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
27.01.2015, 15:09  [ТС] 11
Хорошо. Но таким образом функция даже не начинает выполняться. Всё из-за типа p-bstr. Функция принимает String.
В чём может быть проблема?

Добавлено через 4 минуты
"не начинает выполняться" это я подразумевал что выдает ошибку)
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,571
Записей в блоге: 6
27.01.2015, 15:14 12
Цитата Сообщение от Randen Посмотреть сообщение
Функция принимает String.
Для начала нужно выяснить какой формат строки в VB6.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
27.01.2015, 16:14  [ТС] 13
locm, скорее всего bstr. Т.к. эта функция:
PureBasic
1
2
3
4
5
6
7
8
9
10
Procedure.l ansi2bstr(ansi.s)
  size.l=MultiByteToWideChar_(#CP_ACP,0,ansi,Len(ansi),0,0)
  Dim unicode.w(size)
  MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size);#CP_ACP
  For i=0 To size
        tmp.s + Hex(unicode(i),#PB_Unicode)
        Next
  ;MessageRequester(Str(size), tmp )
  ProcedureReturn SysAllocString_(@unicode())
EndProcedure
при кодировке Ansi, выручала.

Добавлено через 58 минут
Всё, разобрался. Спасибо
0
27.01.2015, 16:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2015, 16:14
Помогаю со студенческими работами здесь

Unicode - указатели на строки
Добрый день! Работаю в VS 2010. Для начала приведу вырезку из кода: void Rational::errorMsg()...

Сохранить строки в Unicode
Здравствуйте! Подскажите как сохранить две строки (String str, str_2) в файл в Unicode. Так...

Сменить кодировку строки на Unicode
Ребят, подскажите, каким образом это делается? $str = "asdfasdf"; Как ее в unicode преобразовать?

Как выводить строки в unicode?
почему не выводит на экран строки в формате unicode? в win32 прикрасно работает, а в консоле не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru