Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > dll - требуется разъяснение


Автор: gonzales 27.12.2006, 16:05
Хочу создать систему плагинов, ознакомился с созданием библиотек, в принципе все понятно, но есть один вопрос:

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

1. Экспортирую функции из библиотеки: 
      Init - функция создания экземпляра класса устройства
      Open - функция доступа к устройству
      GetCode - функция возвращающая значение регистра устройства

2. В приложении вызываю функию Init - создается экземпляр класса из библиотеки (и держится в памяти)
3. В приложении вызываю Open - созданный наследник дает доступ к устройству
4. Запускаю таймер в приложении, по которому вызываю GetCode - который возвращает значение регистра устройства в приложение

Скажите, уважаемые, будет ли такая схема работать?

Автор: Bose 27.12.2006, 18:59
как всё сложно описано.
1. это будет работать
2. где создаётся экземпляр класса? в библиотеке!
3. какой наследник? кто-то умер? 
4. это будет работать, если будет написано правильно

Автор: gonzales 27.12.2006, 21:32
может и сложно но зато понятно.

2. экземпляр создается в библиотеке
3. имеется в виду экземпляр

в общем если я все правильно понял - такая схема должна работать

Автор: Bose 28.12.2006, 04:01
Цитата(gonzales @  27.12.2006,  21:32 Найти цитируемый пост)
может и сложно но зато понятно.


непонятно. потому и написал что сложно smile 

Цитата(gonzales @  27.12.2006,  21:32 Найти цитируемый пост)
в общем если я все правильно понял - такая схема должна работать

должна. при парочке условий:
1) приложение ничего не узнает об экземпляре класса в плагине(если это Длл)
2) функции Init, Open и GetCode - должны быть действительно функциями(а не методами). Желательно с директивой stdcall;

Автор: MetalFan 28.12.2006, 10:06
а "экземпляр класса" где убиваться будет? нельзя вроде как из библиотеки делфевые классы(экземпляры) передавать

Автор: gonzales 28.12.2006, 11:29
да, приложению этот экземпляр класса до лампады - ему главное получать значение GEtCode, а убиваться он будет при закрытии библиотеки


 

Автор: gonzales 28.12.2006, 12:50
один вопрос: 
не могу понять, почему не работает???

пишу в библиотеке функцию
Код

function Open(i:word):word;
begin
result:=i;
end;


в основной программе
Код

@Open := GetProcAddress(handle,'Open');
 if @Open <> nil then
    i:=Open(1);


получаю i=2456 и следом Acsess Violation

разобрался, все дело было в том, что я писал function Open(i:word):word; stdcall;

без него все работате

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)