![]() |
|
#1
|
|||
|
|||
![]() народ. помогите разобраться. любая библиотека работает от приложения типа *.ехе
я знаю что одна библиотека при необходимости может обращаться к другой. что надо прописать чтобы 1.dll обращался не к *.ехе а к 2.dll ? расклад такой: приложение при запуске обращается к 1.dll, после чего 1.dll должна обратиться к 2.dll... |
#2
|
|||
|
|||
![]() Используй динамическую загрузку библиотек
|
#3
|
|||
|
|||
![]() не понял... какая разница какая загрузка? разница что у статической размер кода меньше, а толку?
суть в том что мне не нужны в приложении if/then/else или там разные кнопки. кнопка одна и процедура утвердительная, при нажатии на кнопку приложение обращается в одну библиотеку и все. далее эта библиотека уже сама должна обратиться к другим и там уже в зависимости if/then/else .... я уже пытался в одной библиотеке прописать код вызова в другую также как и в приложении, но понял что это глупо ![]() или это было предложение строить дерево кодов из динамических загрузок? Последний раз редактировалось drkane, 28.07.2008 в 10:42. |
#4
|
|||
|
|||
![]() Всё делается по цепочке:
Project1.exe: Код:
function Fun1(X1, X2: Integer): Integer; external 'lib1.dll'; procedure TForm1.Button1Click(Sender: TObject); begin Caption:= IntToStr(Fun1(2, 3)); end; Код:
function Fun2(Y1: Integer): Integer; external 'lib2.dll'; function Fun1(X1, X2: Integer): Integer; begin Result:= Fun2(X1) + Fun2(X2); end; exports Fun1; begin end. Код:
function Fun2(Y1: Integer): Integer; begin Result:= Sqr(Y1); end; exports Fun2; begin end. |
#5
|
|||
|
|||
![]() помоему я так уже пытался сделать... не помню, но чтото пытался...
это действующая цепочка? вечером попробую ![]() |
#6
|
|||
|
|||
![]() По моему, это архитектурная ошибка.
у тебя получается промежуточная длл, которая все-равно ничего не делает. ИМХО, если я правильно понял задачу, то тут как раз нужна динамическая подгрузка разных длл, экспортирующих одну и ту же функцию (по игнатуре). А какую длл ты грузишь - определяют настройки основной программы. У меня так на работе сделана шифровка. в зависимости от параметра подгружается одна или другая длл. Обе экспортируют одинаковую функцию. Одна длл ничего не шифрует, просто перекладывает данные. А вторая, собственно, с шифрованием. |
#7
|
|||
|
|||
![]() Цитата:
Цитата:
![]() Последний раз редактировалось drkane, 28.07.2008 в 23:37. |
#8
|
|||
|
|||
![]() AlexSku, только я не пойму, можешь подсказать?
даже если в промежуточном dll тупо делать перенос инфы на другой dll, при компиляции приложение все равно выдает месагу написанного... Project.exe Код:
procedure TForm1.Button1Click(Sender: TObject); var s:string; begin s:= edit1.Text; kindtext(pchar(s)); Код:
procedure kindtext(P:pchar); stdcall; var result,s:string; begin s:= strpas(P); result:= s; дефект?))) как прописать dont showmessage ? ЗЫ. твой код мне оч помог разобраться, где я сделал ошибку, спасибо ![]() |
#9
|
|||
|
|||
![]() Если юзаешь свои dll то смело можешь делать статическую подгрузку. Единственный минус в память все dll грузиться, но обработка быстрее происходит. думаю как подключать dll к exe знаешь а подключать dll к dll аналогично в первой dll делаешь ссылку на вторую dll
Код:
library 1.dll; uses SysUtils; function proc2(y: integer): integer; external '2.dll'; var ... function proc1(x: integer):integer; stdcall; exports; begin result:=proc2(x); end; exports proc1; остально додумаешь. Я так до пяти библиотек подключал и все работает. |
#10
|
|||
|
|||
![]() Цитата:
![]() причем я их не писал нигде... 2 библиотеки вчера связал, но почему то вылетает мессага с результатом первой длл, хотя showmessage у меня прописан на 2-й, а это еще как минимум через 2 процедуры и ф-цию. в результате получается 2 мессаги, вместо одной: 1-я с заданной инфой, 2-я уже с обработанной... чтото я делаю неправильно, хотя вроде все точно |
#11
|
|||
|
|||
![]() А у тебя нигде в системном или текущем каталоге нет старой версии либы с сообщением?
|
#12
|
|||
|
|||
![]() есть одна..., но у нее другое имя и мессага тоже не прописана... не задумывался, что это может быть из-за нее... конфликт может быть?
да она и к проекту никакого отношения не имеет.. по крайней мере в коде |
#13
|
|||
|
|||
![]() есть! я разобрался в чем фишка!))) сам дурак, называется.
спасибо всем кто помогал))) но, судя по тому как я ступил при компиляции, я еще вернусь ![]() |
#14
|
|||
|
|||
![]() Люди помогите!!!! кто может написать код библиотек .dll с денамической загрузкой и со всеми прибомбасами!!! А то делаю по учебнику, а делфик выдает ошибку в коде!!!!
|
#15
|
||||
|
||||
![]() Юзай функции WinAPI:
LoadLibrary(LibFileName: PChar) - загрузка указанной библиотеки LibFileName в память. При успешном завершении функция возвращает дескриптор (THandle) DLL в памяти. GetProcAddress(Module: THandle; ProcName: PChar) - считывает адpес экспоpтиpованной библиотечной функции. При успешном завершении функция возвращает дескриптор (TFarProc) функции в загруженной DLL. FreeLibrary(LibModule: THandle) - делает недействительным LibModule и освобождает связанную с ним память. Следует заметить, что после вызова этой процедуры функции данной библиотеки больше недоступны. P.S. Google тебе в помощь. Он рулит. Учись пользоваться поиском и эксперементировать. Программирование - это искусство и наш смысл жизни. |