Главная страница
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.51 MB
Время: 0.022 c
14-1086846965
stone
2004-06-10 09:56
2004.06.27
Подставка под кофе


4-1084515454
Viman
2004-05-14 10:17
2004.06.27
Определение типа отрисовки контролов(visual style) под WinXP


9-1078046012
Cerber
2004-02-29 12:13
2004.06.27
diablo 1


1-1086774425
guest
2004-06-09 13:47
2004.06.27
TAnimate


1-1086886653
Ivolg
2004-06-10 20:57
2004.06.27
Резка