| 
| 
 | Вопрос # 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сця, де призупинилося.
 
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |