Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: mirt.steelwater (статус: Посетитель)
Вопрос отправлен: 17 декабря 2010, 10:29
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 20 декабря 2010, 20:53; участников в обсуждении: 4.

17 декабря 2010, 10:34: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором min@y™

min@y™

min@y™ (статус: Доктор наук), 17 декабря 2010, 10:40 [#1]:

Дык создай тестовую DLL и поэкспериментируй.
О результатах доложи, а там посмотрим.

З.Ы. 1-й раз слышу, что из DLL можно экспортировать глобальные переменные.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 17 декабря 2010, 11:07 [#2]:

А вот экспорт виртуальных методов объектов, создающихся в DLL, действительно возможен. Я щас нашёл в книжке примерчик.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 17 декабря 2010, 11:17 [#3]:

К переменным можно, а вот к классам - не стоит. Проблем будет много. Если возникла необходимость импортировать классы - используем bpl
Галочка "подтверждения прочтения" - вселенское зло.
mirt.steelwater

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

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

bugmenot (статус: 3-ий класс), 20 декабря 2010, 20:53 [#7]:

класс совершенно лишний
а так должно работать, ибо указатель на общую область памяти
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.04 сек.