Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Как получить строки из 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
1-1087038493
guest_Dmitry
2004-06-12 15:08
2004.06.27
Стоит ли уничтожать динамически созданные компоненты?


4-1084938534
HellWaiter
2004-05-19 07:48
2004.06.27
Список дисков


3-1085639743
lightix
2004-05-27 10:35
2004.06.27
Вызов хранимой процедуры в ODAC


14-1086598998
BiN
2004-06-07 13:03
2004.06.27
Случайно никто квартиру не сдает?


11-1075723164
Solik
2004-02-02 14:59
2004.06.27
Максимизация окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский