Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить строки из DLL при вызове функции? [D7, Win95/98, WinXP]


mmb ©   (2004-06-12 08:39:00) 

Необходимо, после вызова функции из DLL получить несколько сообщений (заранее неизвестно сколько) о результатах работы этой функции. Как это лучше зделать?


PVOzerski   (2004-06-15 18:26:00) [1]

Рекомендую что-нибудь такое
function MyDllFunc(var Buff; BuffLen:longint):longint;
Передавать буфер и его длину, писать строку в буфер, возвращать длину написанного блока. Если предоставленный буфер мал, обрубать строку.


mmb   (2004-06-15 17:43:00) [2]


> [17] ЮрийК ©   (15.06.04 15:06)
> SendMessage использовать.

Отличная мысль, так бы ещё и в TMemoстроки добавлять.


ЮрийК   (2004-06-15 15:06:00) [3]

SendMessage использовать.
В ДЛЛ нужно передать Хэндл окна (Лэйбл, Эдит, Панель), где строки будут отображаться.


evvcom   (2004-06-15 14:28:00) [4]

аналог HeapAlloc в Fortranе и не надо делать. Надо только вызвать функцию API HeapAlloc. Функции из dll Fortran вызывать, наверное, умеет?


mmb   (2004-06-15 12:46:00) [5]

2 evvcom> Первый вариант для моего случая не очень подходит, т.к. функция из DLL вызывается в цикле одинраз для каждой порции данных, а строки я запоминаю для показа в конце обработки.
С памятью вариант хороший, единственное, что я не знаю как сделать аналог HeapAllocв Fortranе.
Вот если бы можно было перехватить стандартный вывод, как ото делается с консольными приложениями, вот это было бы оптимальное решение, но я пока не могу найти, как это сделать?


evvcom   (2004-06-15 09:58:00) [6]


> Библиотеки действительно на C, а также на Fortran.

Судя по всему есть возможность их поправить, поэтому можно сделать так, как делается в API. Выделяешь память (сколько не жалко) и вызываешь функцию с указателем на память и var параметром количества выделенной памяти (хоть с нулем). Функция копирует по-максимуму (или не копирует, если 0), а в этом var параметре возвращает реальное требуемое количество байт. Если было выделено мало памяти, то повторный вызов с новыми параметрами опять копирует строки по указателю.

А еще я встречал такой вариант, который отступает от

> "Освобождать память нужно там же где ее выделили"

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


mmb   (2004-06-15 09:40:00) [7]

2 GuAV// А каким образом GetStdHandle и др. Console Functionsсвязать с загруженной библиотекой?


mmb   (2004-06-15 09:20:00) [8]

2 Mim1> Библиотеки действительно на C, а также на Fortran. Проблема возникает из-за, того, что неизвестно под сколько строк выделять память.


GuAV   (2004-06-14 12:40:00) [9]


> А причём здесь stdout/stdin, как им можно воспользоваться ?

RTFM GetStdHandle и др. Console Functions


Mim1   (2004-06-13 09:48:00) [10]

Передавайте ссылку на массив ссылок на строки. В реализации это выглядит лучше чем звучит :).
Так же можно передавать строку с разделителями, например #13#10 (если таковые встречаются). Так же если библиотека написана на delphi той же версии что и вызывающая программа то можно подключить менеджер памати delphi и передавать ссылку на обьект наследник tstrings.
PS Не забудте простое правило "Освобождать память нужно там же где ее выделили" ( (с) не помню ), то есть либо использовать обший менеджен памяти если бибилиотека и программа написана на одной версии delphi. Либо заранее выделять буфер, и передавать в процедуру ссылку на этот буфер для его наполнения если библиотека например сишная или хочыется универсальности, или еще чтото :).


mmb   (2004-06-13 08:50:00) [11]

Проблема в том, что строк может быть несколько (заранее неизвестно сколько), а вызов функции из DLL - один.
2 GuAV ©// А причём здесь stdout/stdin, как им можно воспользоваться ?


GuAV   (2004-06-12 19:34:00) [12]

mmb   (12.06.04 14:33) [6]
напрашивается ассоциация с stdout/stdin...


Mim1   (2004-06-12 19:16:00) [13]

Так в чем проблемма то?


mmb   (2004-06-12 14:33:00) [14]

Понял - я неправильно сформулировал - не сообщений, а строк. В смасле функция сообщает - "всё хорошо, обработано 20 точек" или "ошибка в 12 точке" или даже в каком-то случае 2 строки.


GanibalLector   (2004-06-12 12:48:00) [15]

postmessage ???


FragMan   (2004-06-12 11:32:00) [16]

> mmb
:) извини, я просто пошутил! Конкретизийруй вопрос :)

А "checked .. ok" пишется обычно после сканирования винчестера :)

Checkedв переводе с английского - проверено

А так вот тут есть очень интересные вещи!

http://delphiworld.narod.ru/_files_.html

Смотри раздел 2 - "DLL и PlugIns"


Mim1   (2004-06-12 11:25:00) [17]

А библиотека ваша?
В связи с чем возник такой вопрос, есть какие то трудности?
Извольте отписаться поподробнее :).


mmb   (2004-06-12 10:35:00) [18]

Что означает Checked ?


FragMan   (2004-06-12 09:18:00) [19]

Checked .. OK


Наверх

Титульная страница Поиск, карта сайта Написать письмо