Получить из Procedure() то, сам не знаю что ....

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение Игорь Столяров »

Привет всем !

Возникло непреодолимое желание получить ответ на еще один детский вопрос. ;)

Нужна процедура, которая загружает из интернет в строку (память) некий объем информации и возвращает указатель на эту строку.
Проблема в том, что на момент вызова процедуры, я не знаю какой объем информации будет загружен по переданной в нее ссылке.

1. В процедуре через NEW() создаем динамическую строку и загружаем в нее информацию.
Знаем объем загруженной информации и есть указатель на строку с этой информацией.

2. Как вернуть эти данные в точку вызова процедуры ?
Существует явный запрет на изменения адреса параметра процедуры типа *String
Т.е. я не могу переключить параметр-адрес и вернуть из процедуры указатель на строку. :(

3. Эксперименты с типом параметра процедуры *?, ANY, Signed и передача в них адреса строки - не получились.
Это в принципе невозможно или можно решить вопрос через какую-то хитрую игру с адресами строк ?
Зачем тогда вообще тип возвращаемого параметра Proc(),*String ?

4. Можно создавать строку в GLOBAL DATA - но это не удобно для Multi DLL приложений.

5. Сейчас вопрос решается следующим образом:
- В процедуре по ссылке загружаю информацию в ФАЙЛ и возвращаю имя файла;
- По размеру файла создаю строку и загружаю из него информацию в память;
- Удаляю файл.
Все работает. Но это же бред ... :(

Заранее спасибо за любые идеи. :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение kreator »

1. А какие проблемы, если возвратить просто String? Есть разве ограничение на размер возвращаемой строки?
2. Адрес можно передать через заголовок. А в процедуре попробовать сделать переадресацию, что-ли.
3. Попробовать возвратить CString, в хелпе написано, что компилятор понимает этот тип как "char *", надо думать что-то типа адреса.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получить из Procedure() то, сам не знаю что ....

Сообщение Admin »

Если читаешь блоками через InternetReadFile то что мешает воспользоваться IDynStr из LibSrc\DYNSTR.INC
По идее для класса все равно что ты туда закинешь байты или символы.
Или я не о том?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение Игорь Столяров »

1. Возвратить из процедуры STRING проблем нет. А куда я ее получу, если не знаю длину возвращаемой строки ?
2. Вот и я пытаюсь найти это "что-ли", но пока результата нет. ;)
3. Идею с CString отбрасываем сразу, т.к. загружаемые данные могут иметь бинарную структуру (например картинки) и содержать "<0>".
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение Игорь Столяров »

Admin писал(а): Если читаешь блоками через InternetReadFile то что мешает воспользоваться IDynStr из LibSrc\DYNSTR.INCПо идее для класса все равно что ты туда закинешь байты или символы.Или я не о том?
Не о том. Динамически расширяющуюся строку для загрузки в нее произвольного кол-ва блоков данных я могу и сам создать, это не сложно.
Вопрос в том как вернуть из процедуры адрес этой строки ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получить из Procedure() то, сам не знаю что ....

Сообщение Admin »

Обязательно строки?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получить из Procedure() то, сам не знаю что ....

Сообщение Admin »

Глупый вопрос. Понял...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение Игорь Столяров »

Admin писал(а):Обязательно строки?
Нет. Некий массив данных. Строка удобна: в ней можно искать (парсить если текст), можно сохранить в файл и т.д.
Можно конечно грузить загруженные блоки в очередь, а потом из них формировать строку - но это слабо отличается от существующего решения с файлом ....
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получить из Procedure() то, сам не знаю что ....

Сообщение Admin »

Чем читаешь файл из инета, какими процедурами?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получить из Procedure() то, сам не знаю что ....

Сообщение Admin »

Если InternetReadFile то воспользуйся HttpQueryInfo
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение Игорь Столяров »

Admin писал(а): Чем читаешь файл из инета, какими процедурами?
InternetReadFile(Loc:hUrl,Loc:Buffer,Loc:Buffersize,Loc:BufferLength) - просто передрал столетний пример WEBCOPY с сайта CLARIONLIFE.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Получить из Procedure() то, сам не знаю что ....

Сообщение Admin »

HttpQueryInfo
И вообще сюда смотрим: https://msdn.microsoft.com/ru-ru/librar ... s.85).aspx
Много чего интересного есть.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение Игорь Столяров »

Admin писал(а): HttpQueryInfo
Нет никаких проблем тем или иным способом загрузить строку в память по ссылке.
Проблема в том, как вернуть эту строку из процедуры в Clarion, если он не хочет возвращать из процедуры адрес этой строки ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Получить из Procedure() то, сам не знаю что ....

Сообщение Yufil »

Хмм. А мои классы CHTTP и CSTR не прокатят? Они вроде как для этого, в том числе и создавались... Класс CHTTP может грузить файл в память и возвращать как раз ссылку на строку. А CSTR работает с длинными строками, но хранит их в обычном String (или Cstring, если надо)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Получить из Procedure() то, сам не знаю что ....

Сообщение Игорь Столяров »

Yufil писал(а): Хмм. А мои классы CHTTP и CSTR не прокатят? Они вроде как для этого, в том числе и создавались...
Упс ! :) Похоже, что я опять пытаюсь изобрести колесо ... ;)
Скажите пожалуйста, а где можно их загрузить и посмотреть ?
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить