Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1084866284
PavelT
2004-05-18 11:44
2004.06.27
Программное изменение параметра (По умолчанию) в реестре


1-1087220603
Evg_fat
2004-06-14 17:43
2004.06.27
Значения ф-ции WordDocument1.Tables.Item(1).Rows.Alignment:


6-1083582436
Amid
2004-05-03 15:07
2004.06.27
Создать Функцию каторая ждала сообщение от Сервера


6-1083752795
cherrex
2004-05-05 14:26
2004.06.27
SNIFFER сети


1-1086788472
Sour
2004-06-09 17:41
2004.06.27
Работа с ключами рееста типа REG_MULTI_SZ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский