Получение строки, содержащей символы ASCII-null

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Есть во внешней (чужеродной) DLL некая функция, которая возвращает строку.
Описание ее примерно такое:
SomeFunc(ULONG,ULONG,ULONG,ULONG,*CSTRING),LONG,PASCAL,RAW
4-й по счету параметр - это число байт, которое я хочу получить.
5-й параметр - строка, которую я хочу получить.
Проблема состоит в том, что если в возвращаемой строке содержатся символы (ASCII 0), то эта строка обрезается до первого такого символа, и дальше уже ничего не возвращается.
Есть ли ли какой-нибудь способ решить эту проблему?

Написал: Booroondook(77)
Гость

Сообщение Гость »

Привет

Можно описать её как
SomeFunc(ULONG,ULONG,ULONG,ULONG,LONG),LONG,PASCAL,RAW и считать требуемое кол-во байт начиная с этого адреса

С уважением, Михаил
Гость

Сообщение Гость »

Проблема состоит в том, что если в возвращаемой строке содержатся символы (ASCII 0), то эта строка обрезается до первого такого символа, и дальше уже ничего не возвращается.
Если дейсвтительно ничего не возвращается - это проблема чужой либы, тут ничего не поделаешь. Если не читается из параметра-строки - это проблема использования данной либы :)
Возвращаемую строку нужно интерпретировать как массив, а не как строку типа CSTRING - и не будет проблем.
Гость

Сообщение Гость »

Да, я уже "своим умом" дошел до этого.
Продекларировал эту возвращаемую строку как массив байтов. И все заработало.
Написал: Booroondook(77)
Гость

Сообщение Гость »

Ну почему как массив - просто String. А ещё лучше описать параметр как Ulong и передать адрес буфера.

--
C уважением
Yuri
Адрес:yufil@mail.ru

Часто вижу такую (по смыслу) фразу. Мне кажется, господа-товарищи вы себя перемудрили.
Если дописать к процедуре RAW, то вместо строки (в кларионовском понятии) будет
передан АДРЕС.
Т.е.
proc procedure(unsigned parString)
и
proc procedure(*string parString), raw
это суть ОДНО И ТО ЖЕ. Только код исходника красивше и понятней.

Поправьте меня, если я не прав...

Сергей - chusha@mail333.com ; chusha@hotbox.ru

Поправляю :)
не proc procedure(unsigned parString), а proc procedure(long lpData) или proc procedure(ulong lpData)

По существу:
Где и как нагляднее применять LONG/ULONG или *CSTRING/*STRING, это сильно зависит от процедуры, многие функции Windows API допускают передачу такого параметра как NULL, соответственно тут уже остается использовать LONG/ULONG. И зависит от того, как дальше полученные данные будут обрабатываться. Если вся дальнейшая обработка не связана с использованием функционала CSTRING/STRING, то и смысла получать данные как *CSTRING/*STRING мало.

Вот как в изначально описанной задаче, очевидно, что получается не строка (как таковая) а некая структура, которая мрожет содержать '<0>', таким образом CSTRING/STRING используется просто как буфер, ну дык может более правильно получать данные как proc procedure(*MySpecGrpType MySpecGrp),RAW, где MySpecGrpType это GROUP,TYPE

и тогда уже не LONG/ULONG, и не *CSTRING/*STRING, а *MySpecGrpType must be forever? :)

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Ответить