UNICODE и API

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 11.08.2004 (Ср) 9:10

ANDLL писал(а):В-общем так:
Код: Выделить всё
long StrRest(BSTR*str)
{
   str++;
   MessageBoxW(NULL,*str,L"Строка",0);
   return 0;
}

И:
Код: Выделить всё
Private Declare Function StrRest Lib "X-Lib.dll" (ByRef xStr As String) As Long

StrRest "VB-String"


И сее работает. Если убрать str++, то не работает.


Эта программа не будет работать, если передать не строку-константу. Т.е.
Код: Выделить всё
Dim s As String
s = "VB-String"
StrRest s
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 11.08.2004 (Ср) 10:28

Только объявление надо поменять:
Код: Выделить всё
long StrRest(LPCSTR*str)
...


Тогда действительно все работает.
Ну так?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.08.2004 (Ср) 11:03

ANDLL писал(а):Только объявление надо поменять:
Код: Выделить всё
long StrRest(LPCSTR*str)
...


Тогда действительно все работает.
Ну так?

Что и требовалось доказать - при передаче строки по ссылке, VB её всё равно переводит в ANSI. Т.е. это тупиковый путь.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 11.08.2004 (Ср) 13:33

Почему не работает выясняли.
А почему работает?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.08.2004 (Ср) 14:08

ANDLL писал(а):Почему не работает выясняли.
А почему работает?

Потому что при вызове со строковой константой случайно получается так, что "правильный" BSTR лежит в памяти сразу же после "неправильного" ABSTR.
Т.е.
Код: Выделить всё
переданный адрес -> ABSTR -> первый символ временной ANSI-копии
                    BSTR -> первый символ правильной Unicode-строки

А вот при передаче настоящей строки этот трюк уже не срабатывает.
Ещё (NB!) проверь твой трюк для процедуры с двумя BSTR*-параметрами. Если моя гипотеза верна, то там придётся инкрементировать каждый из указателей дважды.

Пред.

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

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

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

    TopList