![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить строки из 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