Форум: "Основная";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];
ВнизНекоторые замечания к статье Найти похожие ветки
← →
Sleepyhead (http://www.excelsior-usa.com/) (2002-02-03 14:18) [0]Здравствуйте!
В статье Кариха Николая (Московская область, г.Жуковский) "Использование и создание DLL в Delphi" http://delphi.mastak.ru/articles/usedll/index.html, по словам автора "отображены основные стороны использования и создания библиотек DLL в Borland Delphi", что, несомненно, так - аккуратно и достаточно подробно описаны случаи и методы использования DLL. Я, пользуясь предложением автора "еще лучше - пишите в конференции этого сайта (Delphi. Общие вопросы)", хочу отметить, что нередко возникает проблема использования в программах, написанных под Delphi, сторонних DLL, разработанных с помощью других систем программирования (СП). Есть и другая, обратная, проблема - как Dll, разработанную под Delphi, использовать в приложениях, разработанных с помощью других СП?
Использование DLL, экспортирующих, скажем так, "вычислительные" функции, не представляет почти никаких проблем, как при использовании из программ на Delphi, так и наоборот. Хотя и здесь, к сожалению, не все сторонние библиотеки могут быть использованы из Delphi. В частности, в Delphi не поддерживается механизм вызова функций с произвольным числом параметров с stdcall-ным соглашением о вызовах (не путать с функциями с произвольным числом параметров в Oject Pascal - это совершенно другое соглашение о вызовах, поддерживаемое в Delphi, которое, очевидно, не может быть использовано для работы с alien-DLL) - а такие функции не редкость в программах на С. Кажется, что это не такая уж и проблема, однако многие программисты, пытающиеся по каким-либо причинам использовать чужие DLL, с завидной регулярностью наступают на эти хорошо замаскированные грабли, когда после вызова из DLL функции, принимающей произвольное число параметров, на стеке остается мусор, не убранный вызывающей Delphi-функцией.
Как ни странно, довольно много программистов, работающих под Delphi, используют внешние Dll, написанные на Java (приношу свои извинения за, возможно, непринятое тут слово Java...). Borland предоставляет даже специальный модуль JNI.pas, который почти эквивалентен Sun"новского jni.h. Я сказал "почти эквивалентен" потому, что в jni.h огромное количество функций как раз могут принимать произвольное число параметров, так что вместо функций CallXXXMethod необходимо использовать CallXXXMethodV, что, конечно, просто запомнить, однако работать с функциями CallXXXMethodV гораздо неудобнее, чем с CallXXXMethod (и, кроме того, замечено, что использование функций CallXXXMethodV чаще приводит к ошибкам). Кстати, подобные проблемы и решения обсуждаются тут Delphi-Java Bridge (JNI Wrapper for Delphi) http://sourceforge.net/projects/djbridge/ Примеры использования JNI для Delphi можно найти тут http://www.excelsior-usa.com/jet.html
Другая проблема - как использовать DLL, написанную под Delphi, в других приложениях? В особенности, если из такой DLL экспортируются формы? Это уже не так тривиально, как может показаться на первый взгляд. Во-первых, всегда необходимо помнить о том, что VCL - сугубо однопоточная библиотека. Все формы, базирующиеся на или разработанные с использованием VCL, должны работать в одном потоке. Если это требование не удовлетворяется, возникает множество проблем! Если "главное" приложение, использующее такую DLL, тоже GUI-вое, то возникает еще и определенный конфликт, что сообщения от всех окон (как от окон "главного" приложения, так и от форм Delphi) будут передаваться в процедуру потока, где все эти окна были созданы - как правильно диспетчирезировать эти сообщения? В таком случае очень желательно разнести создание окон "главного" приложения и окон-форм Delphi в разные потоки. Однако тогда возникает еще одна проблема - как доступаться до форм Delphi и других визульных Delphi-компонентов из другого потока (в котором работает "главная" программа), ведь, как правило, в таких случаях происходит dead-lock всего приложения - VCL не допускает этого! (Решить все эти проблемы можно, и я успешно решал их, однако это уже тема для отдельной статьи)
До свидания,
Sleepyhead
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c