Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизКак получить строки из DLL при вызове функции? Найти похожие ветки
← →
mmb (2004-06-12 08:39) [0]Необходимо, после вызова функции из DLL получить несколько сообщений (заранее неизвестно сколько) о результатах работы этой функции. Как это лучше зделать?
← →
FragMan (2004-06-12 09:18) [1]Checked .. OK
← →
mmb (2004-06-12 10:35) [2]Что означает Checked ?
← →
Mim1 © (2004-06-12 11:25) [3]А библиотека ваша?
В связи с чем возник такой вопрос, есть какие то трудности?
Извольте отписаться поподробнее :).
← →
FragMan (2004-06-12 11:32) [4]> mmb
:) извини, я просто пошутил! Конкретизийруй вопрос :)
А "checked .. ok" пишется обычно после сканирования винчестера :)
Checked в переводе с английского - проверено
А так вот тут есть очень интересные вещи!
http://delphiworld.narod.ru/_files_.html
Смотри раздел 2 - "DLL и PlugIns"
← →
GanibalLector © (2004-06-12 12:48) [5]postmessage ???
← →
mmb (2004-06-12 14:33) [6]Понял - я неправильно сформулировал - не сообщений, а строк. В смасле функция сообщает - "всё хорошо, обработано 20 точек" или "ошибка в 12 точке" или даже в каком-то случае 2 строки.
← →
Mim1 © (2004-06-12 19:16) [7]Так в чем проблемма то?
← →
GuAV © (2004-06-12 19:34) [8]mmb (12.06.04 14:33) [6]
напрашивается ассоциация с stdout/stdin...
← →
mmb (2004-06-13 08:50) [9]Проблема в том, что строк может быть несколько (заранее неизвестно сколько), а вызов функции из DLL - один.
2 GuAV ©// А причём здесь stdout/stdin, как им можно воспользоваться ?
← →
Mim1 © (2004-06-13 09:48) [10]Передавайте ссылку на массив ссылок на строки. В реализации это выглядит лучше чем звучит :).
Так же можно передавать строку с разделителями, например #13#10 (если таковые встречаются). Так же если библиотека написана на delphi той же версии что и вызывающая программа то можно подключить менеджер памати delphi и передавать ссылку на обьект наследник tstrings.
PS Не забудте простое правило "Освобождать память нужно там же где ее выделили" ( (с) не помню ), то есть либо использовать обший менеджен памяти если бибилиотека и программа написана на одной версии delphi. Либо заранее выделять буфер, и передавать в процедуру ссылку на этот буфер для его наполнения если библиотека например сишная или хочыется универсальности, или еще чтото :).
← →
GuAV © (2004-06-14 12:40) [11]
> А причём здесь stdout/stdin, как им можно воспользоваться ?
RTFM GetStdHandle и др. Console Functions
← →
mmb (2004-06-15 09:20) [12]2 Mim1> Библиотеки действительно на C, а также на Fortran. Проблема возникает из-за, того, что неизвестно под сколько строк выделять память.
← →
mmb (2004-06-15 09:40) [13]2 GuAV// А каким образом
GetStdHandle и др. Console Functions
связать с загруженной библиотекой?
← →
evvcom © (2004-06-15 09:58) [14]
> Библиотеки действительно на C, а также на Fortran.
Судя по всему есть возможность их поправить, поэтому можно сделать так, как делается в API. Выделяешь память (сколько не жалко) и вызываешь функцию с указателем на память и var параметром количества выделенной памяти (хоть с нулем). Функция копирует по-максимуму (или не копирует, если 0), а в этом var параметре возвращает реальное требуемое количество байт. Если было выделено мало памяти, то повторный вызов с новыми параметрами опять копирует строки по указателю.
А еще я встречал такой вариант, который отступает от
> "Освобождать память нужно там же где ее выделили"
В вызываемой функции выделяется столько памяти сколько нужно (HeapAlloc), а с вызывающей стороны потом делается обязательное HeapFree. Поскольку это прописано в документации к распространяемой dll, то в принципе почему бы не использовать такое?
← →
mmb (2004-06-15 12:46) [15]2 evvcom> Первый вариант для моего случая не очень подходит, т.к. функция из DLL вызывается в цикле один раз для каждой порции данных, а строки я запоминаю для показа в конце обработки.
С памятью вариант хороший, единственное, что я не знаю как сделать аналогHeapAlloc
в Fortranе.
Вот если бы можно было перехватить стандартный вывод, как ото делается с консольными приложениями, вот это было бы оптимальное решение, но я пока не могу найти, как это сделать?
← →
evvcom © (2004-06-15 14:28) [16]аналог HeapAlloc в Fortranе и не надо делать. Надо только вызвать функцию API HeapAlloc. Функции из dll Fortran вызывать, наверное, умеет?
← →
ЮрийК © (2004-06-15 15:06) [17]SendMessage использовать.
В ДЛЛ нужно передать Хэндл окна (Лэйбл, Эдит, Панель), где строки будут отображаться.
← →
mmb (2004-06-15 17:43) [18]
> [17] ЮрийК © (15.06.04 15:06)
> SendMessage использовать.
Отличная мысль, так бы ещё и вTMemo
строки добавлять.
← →
PVOzerski © (2004-06-15 18:26) [19]Рекомендую что-нибудь такое
function MyDllFunc(var Buff; BuffLen:longint):longint;
Передавать буфер и его длину, писать строку в буфер, возвращать длину написанного блока. Если предоставленный буфер мал, обрубать строку.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 1.964 c