|
Вопрос # 4 828/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Собственно вопрос возник после прочтения этой статьи:
http://www.rsdn.ru/article/baseserv/dlluse.xml
здесь написано, что можно получить доступ к переменным dll точно так же, как к функциям. т.е. по идее можно написать что-то вроде
var
myVar: Integer;
begin
@myVar := GetProcAddress (hLib,'myVar');
....
кроме того там описан метод доступа к классу, который полностью описан и реализован только в dll, а мы можем обращаться к нему из своей программы на низком уровне. я догадываюсь, что в дельфи Type Library (tlb) вероятно реализованы таким же образом, хотелось бы узнать - можно ли все это делать в дельфи и если можно, то как
 |
Вопрос задал: mirt.steelwater (статус: Посетитель)
Вопрос отправлен: 17 декабря 2010, 10:29
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 20 декабря 2010, 20:53; участников в обсуждении: 4.
17 декабря 2010, 10:34: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором min@y™
|
min@y™ (статус: Доктор наук), 17 декабря 2010, 10:40 [#1]:
Дык создай тестовую DLL и поэкспериментируй.
О результатах доложи, а там посмотрим.
З.Ы. 1-й раз слышу, что из DLL можно экспортировать глобальные переменные.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 17 декабря 2010, 11:07 [#2]:
А вот экспорт виртуальных методов объектов, создающихся в DLL, действительно возможен. Я щас нашёл в книжке примерчик.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 17 декабря 2010, 11:17 [#3]:
К переменным можно, а вот к классам - не стоит. Проблем будет много. Если возникла необходимость импортировать классы - используем bpl
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mirt.steelwater (статус: Посетитель), 17 декабря 2010, 11:58 [#4]:
library lib;
uses
Windows,
SysUtils,
Classes,
Dialogs,
VarRecs in 'VarRecs.pas';
var
my_int_var : Integer;
function my_int_say (anArgs: array of const) : LongInt; stdcall; export;
begin
Result := 0;
ShowMessage ( 'my_int_say : '+IntToStr (my_int_var) );
end;
function set_my_int (anArgs: array of const) : LongInt; stdcall; export;
begin
my_int_var := ParamToInt (anArgs [0]);
end;
{$R *.res}
exports
my_int_say name 'my_int_say',
set_my_int name 'set_my_int',
my_int_var name 'my_int_var';
begin
end.
lib := TLibrary.Load (['lib.dll']);
if Assigned (lib.ItemOf ['my_int_say']) then
TLibraryFunction(lib.ItemOf ['my_int_say']).Execute ([]);
if Assigned (lib.ItemOf ['set_my_int']) then
TLibraryFunction(lib.ItemOf ['set_my_int']).Execute ([1024]);
if Assigned (lib.ItemOf ['my_int_say']) then
TLibraryFunction(lib.ItemOf ['my_int_say']).Execute ([]);
lib.Free;
это работает
теперь пробуем сделать непосредственное обращение
Ⓐ свобода сопротивление солидарность
|
|
mirt.steelwater (статус: Посетитель), 17 декабря 2010, 12:01 [#5]:
вот класс для загрузки, который я написал для этого
https://www.delphi-int.ru/code/192dadb5
я так и не понял из той статьи - нужно ли помещать переменную в список экспорта или нет, сейчас попробую без этого
>>К переменным можно, а вот к классам - не стоит. Проблем будет много. Если возникла необходимость импортировать классы - используем bpl
это понятно - у меня чисто академический интерес
var
lib : TLibrary;
my_int_var : PInteger;
begin
lib := TLibrary.Load (['lib.dll']);
Pointer (my_int_var) := GetProcAddress (lib.Handle,'my_int_var');
my_int_var^ := 1024;
if Assigned (lib.ItemOf ['my_int_say']) then
TLibraryFunction(lib.ItemOf ['my_int_say']).Execute ([]);
lib.Free;
end;
так не работает
а вот так:
var
lib : TLibrary;
my_int_var : PInteger;
begin
lib := TLibrary.Load (['lib.dll']);
if Assigned (lib.ItemOf ['my_int_say']) then
TLibraryFunction(lib.ItemOf ['my_int_say']).Execute ([]);
if Assigned (lib.ItemOf ['set_my_int']) then
TLibraryFunction(lib.ItemOf ['set_my_int']).Execute ([1024]);
if Assigned (lib.ItemOf ['my_int_say']) then
TLibraryFunction(lib.ItemOf ['my_int_say']).Execute ([]);
Pointer (my_int_var) := GetProcAddress (lib.Handle,'my_int_var');
ShowMessage ( 'read:'+IntToStr (my_int_var^) );
lib.Free;
end;
ура! чтение экспортируемых переменных работает! но не работает запись
для чтения переменной из библиотеки ее нужно поместить в список экспорта.
для изменения значения переменной в библиотеке из вызывающей программы прийдется объявить в библиотеке функцию, кторая будет присваивать данной переменной переданное ей значение.
Ⓐ свобода сопротивление солидарность
|
|
Вадим К (статус: Академик), 17 декабря 2010, 12:44 [#6]:
Помещать нужно, иначе она не получит внешнего адреса.
Академический интерес? тогда придется много чего разобраться.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 20 декабря 2010, 20:53 [#7]:
класс совершенно лишний
а так должно работать, ибо указатель на общую область памяти
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|