Страница 1 из 3

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

Добавлено: 03 Март 2015, 9:39
Игорь Столяров
Привет всем !

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

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

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

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

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

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

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

Заранее спасибо за любые идеи. :)

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

Добавлено: 03 Март 2015, 10:05
kreator
1. А какие проблемы, если возвратить просто String? Есть разве ограничение на размер возвращаемой строки?
2. Адрес можно передать через заголовок. А в процедуре попробовать сделать переадресацию, что-ли.
3. Попробовать возвратить CString, в хелпе написано, что компилятор понимает этот тип как "char *", надо думать что-то типа адреса.

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

Добавлено: 03 Март 2015, 10:09
Admin
Если читаешь блоками через InternetReadFile то что мешает воспользоваться IDynStr из LibSrc\DYNSTR.INC
По идее для класса все равно что ты туда закинешь байты или символы.
Или я не о том?

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

Добавлено: 03 Март 2015, 10:12
Игорь Столяров
1. Возвратить из процедуры STRING проблем нет. А куда я ее получу, если не знаю длину возвращаемой строки ?
2. Вот и я пытаюсь найти это "что-ли", но пока результата нет. ;)
3. Идею с CString отбрасываем сразу, т.к. загружаемые данные могут иметь бинарную структуру (например картинки) и содержать "<0>".

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

Добавлено: 03 Март 2015, 10:16
Игорь Столяров
Admin писал(а): Если читаешь блоками через InternetReadFile то что мешает воспользоваться IDynStr из LibSrc\DYNSTR.INCПо идее для класса все равно что ты туда закинешь байты или символы.Или я не о том?
Не о том. Динамически расширяющуюся строку для загрузки в нее произвольного кол-ва блоков данных я могу и сам создать, это не сложно.
Вопрос в том как вернуть из процедуры адрес этой строки ...

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

Добавлено: 03 Март 2015, 10:18
Admin
Обязательно строки?

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

Добавлено: 03 Март 2015, 10:19
Admin
Глупый вопрос. Понял...

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

Добавлено: 03 Март 2015, 10:21
Игорь Столяров
Admin писал(а):Обязательно строки?
Нет. Некий массив данных. Строка удобна: в ней можно искать (парсить если текст), можно сохранить в файл и т.д.
Можно конечно грузить загруженные блоки в очередь, а потом из них формировать строку - но это слабо отличается от существующего решения с файлом ....

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

Добавлено: 03 Март 2015, 10:23
Admin
Чем читаешь файл из инета, какими процедурами?

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

Добавлено: 03 Март 2015, 10:28
Admin
Если InternetReadFile то воспользуйся HttpQueryInfo

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

Добавлено: 03 Март 2015, 10:28
Игорь Столяров
Admin писал(а): Чем читаешь файл из инета, какими процедурами?
InternetReadFile(Loc:hUrl,Loc:Buffer,Loc:Buffersize,Loc:BufferLength) - просто передрал столетний пример WEBCOPY с сайта CLARIONLIFE.

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

Добавлено: 03 Март 2015, 10:32
Admin
HttpQueryInfo
И вообще сюда смотрим: https://msdn.microsoft.com/ru-ru/librar ... s.85).aspx
Много чего интересного есть.

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

Добавлено: 03 Март 2015, 10:40
Игорь Столяров
Admin писал(а): HttpQueryInfo
Нет никаких проблем тем или иным способом загрузить строку в память по ссылке.
Проблема в том, как вернуть эту строку из процедуры в Clarion, если он не хочет возвращать из процедуры адрес этой строки ... :(

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

Добавлено: 03 Март 2015, 10:40
Yufil
Хмм. А мои классы CHTTP и CSTR не прокатят? Они вроде как для этого, в том числе и создавались... Класс CHTTP может грузить файл в память и возвращать как раз ссылку на строку. А CSTR работает с длинными строками, но хранит их в обычном String (или Cstring, если надо)

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

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