Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача буфера типа String в API, напомните плиз 
:(
    Опции темы
Akina
Дата 31.8.2005, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



помню там получаем адрес дескриптора стринговой переменной, из которого собсно выдираем адрес тела стринга... но вот вылетело - а найти что-то не могу...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
boevik
Дата 31.8.2005, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 12
Всего: 35



К примеру:
Код

Dim sz as Integer
Dim str as String
sz = 255
str = Space(sz)
sz= GetWindowsDirectory(str, sz)



--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
__Sergey__
Дата 31.8.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 21.1.2005

Репутация: 4
Всего: 4



или так
Код

Dim sz as Integer
Dim str as String
str = String(255,0)
sz= GetWindowsDirectory(str, 255)

PM MAIL   Вверх
Mephisto
Дата 31.8.2005, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Код

sub Left
    dim strString$

    MsgBox myFunction(ByVal strString)
End Sub

Function MyFunction (byVal strString&) as String
    MyFunction=cstr(strString)
End Function

Ты об этом????

Это сообщение отредактировал(а) Mephisto - 6.9.2005, 10:04
PM   Вверх
__Sergey__
Дата 31.8.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 21.1.2005

Репутация: 4
Всего: 4



все зависит от того, что АПИ принимает:
- ОЛЕ-строку ( As String);
- указатель на строку(As Long)

Для последнего StrPtr(buf).
PM MAIL   Вверх
Akina
Дата 31.8.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Все намного хуже. Надо передавать буфер в API, причем ByRef, причем описанный как Any. Типа как lpBuffer в

Код

Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, _
                                          lpBuffer As Any, _
                                          ByVal nNumberOfBytesToRead As Long, _
                                          lpNumberOfBytesRead As Long, _
                                          lpOverlapped As Long) As Long


Я помню, там получался дескриптор строки (StrPtr), а потом строился ее адрес при помощи Peek в переменной типа Long... вроде бы...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
__Sergey__
Дата 31.8.2005, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 21.1.2005

Репутация: 4
Всего: 4



да, еще байтовый массив
Код

Dim sz as Integer
Dim str () As Byte
sz= GetWindowsDirectory(str(0), 255)

Добавлено @ 16:08
В ReadFile можно использовать и байтовый массив
и выделить буфер с помошью String$
PM MAIL   Вверх
Plamenk
Дата 31.8.2005, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Может быть это поможет!

Код

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
   Destination As Any, Source As Any, ByVal Length As Long)

Function BSTRtoLPSTR(sBSTR As String, b() As Byte, lpsz As Long) As Long

' Input: a nonempty BSTR string
' Input: **undimensioned** byte array b()
' Output: Fills byte array b() with ANSI char string
' Output: Fills lpsz with a pointer to b() array
' Returns byte count, not including terminating null
' Original BSTR is not affected

Dim cBytes As Long
Dim sABSTR As String

cBytes = LenB(sBSTR)

' ReDim array, with space for terminating null
ReDim b(1 To cBytes + 2) As Byte

' Convert to ANSI
sABSTR = StrConv(sBSTR, vbFromUnicode)

' Point to BSTR char array
lpsz = StrPtr(sABSTR)

' Copy the array
CopyMemory b(1), ByVal lpsz, cBytes + 2

' Point lpsz to new array
lpsz = VarPtr(b(1))

' Return byte count
BSTRtoLPSTR = cBytes

End Function

PM MAIL   Вверх
Kergan
Дата 1.9.2005, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.8.2005

Репутация: 3
Всего: 5



когда делал DLL-ку на C++, там тоже надо было передать BYREF строковый буффер (использовал dll в Basic). Так вот. В функции dll заголовок такой
ExtendedEnumProcs(char* buff)
для тех кто не в курсе char* - почти строка, это указатель на нулевой символ.
Когда юзал в си, все норм, а когда перенес в баську, объявил так:
[code=vb]
(byref buff as string)
[/code=vb]
Испытал и вылетел нафиг... Еще раз... потом еще.
Оказалось, что СТРОКУ передавать надо BYVAL - все равно передаст УКАЗАТЕЛЬ.
ну и само собой ее надо заполнять перед передачей функцией Space...
попробуй в декларации вместо
[code=vb]
lpBuffer as Any
[/code=vb]
поставить
[code=vb]
ByVal lpBuffer as string
[/code=vb]
Можа прокатит...
--------------------
Была у меня дурацкая подпись...Я ее убрал, а новую еще не придумал. :(
PM MAIL ICQ   Вверх
oleg1973
Дата 1.9.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



пардон может я не так понял
но чем lstrcpy не устраивает в данном случае?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Akina
Дата 1.9.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(oleg1973 @ 1.9.2005, 23:03)
чем lstrcpy не устраивает в данном случае?

Тем что VB про существование такой функции не знает


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
oleg1973
Дата 1.9.2005, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



Цитата
Тем что VB про существование такой функции не знает

еше раз пардон
а что разве в ВБ недоступны стандартные АПИ функции винды?

п.с.
я просто на ВБ ни разу ни того smile


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
__Sergey__
Дата 1.9.2005, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 21.1.2005

Репутация: 4
Всего: 4



так я не понял, как на счет байтового массива?
с ReadFile работает без проблем.
показал бы код и какие ошибки вылазят, а то разговор уходит в
неизвестное направление smile

Цитата(Kergan @ 1.9.2005, 16:23)
для тех кто не в курсе char* - почти строка, это указатель на нулевой символ

char* - не почти строкаsmile и не указатель на нулевой символ, а указатель на строку, заканчивающуюся нулевым байтом.
можно так же сказать, что это указатель на первый символ строки.
таким способом: "byref buff as string", ты передаеш адрес BSTR(т.е. указатель на массив символов в юникоде), тогда
как твоя ф-ция на сях ждет АBSTR - указатель на массив ANSI символов.
PM MAIL   Вверх
Akina
Дата 2.9.2005, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(__Sergey__ @ 2.9.2005, 00:45)
как на счет байтового массива? с ReadFile работает без проблем.

Байтовый массив не устраивает - нужно получать именно стринг, для последующей строковой обработки. А пережевывать байтовый массив в строку - долго.
Цитата(oleg1973 @ 2.9.2005, 00:08)
разве в ВБ недоступны стандартные АПИ функции винды?

Почему? доступны... только что и куда ты предлагаешь копировать?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
__Sergey__
Дата 2.9.2005, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 21.1.2005

Репутация: 4
Всего: 4



Цитата(Akina @ 2.9.2005, 08:29)
нужно получать именно стринг

выдели буфер с помощью String$.
так тоже работает.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.