Sign in Join
Wiki copytemporary

DLL dynamically load/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: DLL dynamically load/ru

OldNewLine
1+В руководстве показано, как динамически загружается DLL (библиотека динамической компоновки).
2+
3+Библиотека DLL (DLLTest.dll), указанная в примере ниже:
4+
5+``` pascal
6+ library info;
7+
8+ {$mode objfpc} {$H+}
9+
10+ uses
11+ SysUtils;
12+
13+ {$R *.res}
14+
15+ // Подпрограмма DLL
16+ function funStringBack(strIn : string) : PChar;
17+ begin
18+ funStringBack := PChar(UpperCase(strIn));
19+ end ;
20+
21+ // Экспортированная подпрограмма(ы)
22+ exports
23+ funStringBack;
24+
25+ begin
26+ end.
27+```
28+
29+Что я должен делать:
30+
31+- Определить память
32+ - Необходимо создать тип данных, который точно соответствует (внешней) подпрограмме, которая должна быть импортирована из DLL.
33+- Зарезервировать память
34+ - Память должна быть зарезервирована для переменной (поля данных), которой назначен указанный выше тип данных.
35+ - Память должна быть зарезервирована для дескриптора, которому дескриптор DLL будет назначен позже.
36+- Назначить DLL и внешнюю подпрограмму и принимаемые данные
37+ - Вызвать DLL и назначить дескриптору DLL дескриптор.
38+ - Указатель переменных должен быть заменен на память внешней подпрограммы.
39+ - Результат внешней подпрограммы должен быть принят.
40+- Освободить всю память
41+ - Указатель на переменные должен снова указывать на недопустимую область памяти (:= nil), чтобы освободить внешнюю подпрограмму.
42+ - Память DLL необходимо снова освободить.
43+
44+Интегрируйте, используйте и выпустите подпрограмму DLL в вашей собственной программе:
45+
46+``` pascal
47+ uses
48+ Windows, ...;
49+
50+ ...
51+
52+ Include function funDll : string;
53+ type
54+ // Определение вызываемой подпрограммы, как задано в DLL, которая будет использоваться
55+ TfunStringBack = function(strIn : string) : PChar; stdcall;
56+
57+ var
58+ // Создаем подходящую переменную (поле данных) для подпрограммы DLL
59+ funStringBack : TfunStringBack;
60+ // Создаем дескриптор для DLL
61+ LibHandle : THandle;
62+
63+ begin
64+ // Получаем дескриптор библиотеки, которая будет использоваться
65+ LibHandle := LoadLibrary(PChar('DLLTest.dll'));
66+
67+ // Проверяем успешность загрузки DLL
68+ if LibHandle <> 0 then
69+ begin
70+ // Назначаем адрес вызова подпрограммы переменной funStringBack
71+ // 'funStringBack' из DLL DLLTest.dll
72+ Pointer(funStringBack) := GetProcAddress(LibHandle, 'funStringBack');
73+
74+ // Проверяет, был ли возвращен действительный адрес
75+ if @funStringBack <> nil then
76+ Result := funStringBack('hello world');
77+ end;
78+
79+ // освобождаем память
80+ funStringBack := nil;
81+ FreeLibrary(LibHandle);
82+
83+ end;
84+
85+ ...
86+```
87+
88+---
89+*From the Free Pascal wiki, page "DLL dynamically load/ru", as it stood on 2020-12-15 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history