Раскажите пожалуйста, как правильно можно доверить DLL-ке создание
объектов (экземпляров класса описанного в ней) в главном модуле, который
вызывает эту самую DLL-ку.
Owner'а ей ведь надо передать как-то, но как? Поинтером или просто
TComponent? И как вернуть в главный модуль созданный объект?
Имею:
----------------------I---------------
library actuator1;
uses
ShareMem //а нужен ли он? и с ним и без него - ничего у меня не вышло
..
TValve in 'Valve.pas'
CommonTypes in 'CommonTypes.pas';
function CreateObject(AOwner: TComponent): TControl;
begin
Result:= TValve.Create(AOwner);
end;
exports
CreateObject index 1 name 'CreateObject'
------------------II--------------------
unit valve;
type TValve = class (TGraphicControl);
public
constructor Create(AOwner: TComponent); override;
..
constructor TValve.Create
begin
inhereted Create(AOwner);
end;
//в общем ничего особенного - просто компонент
---------------------III-----------------
//вызов из главной программы
procedure TForm1.LoadObject();
var FHandle: THandle //чем отличается от HWND?
Temp: TControl;
Func: function (AOwner:TComponent): TControl;
begin
FHandle:= LoadLibrary(PChar('actuator1.dll'));
@Func:= GetProcAddress(FHandle,'CreateObject');
//стопудово все грузится и функция находится, по-крайней мере не nil
Temp:= Func(Image1);
//Image1 лежит на ScrollBox1, а он на Form1
FreeLibrary(FHandle);
// а теперь самое сташное - на следующей строчке Access Violation в
Project1.exe
Temp.Parent:= ScrollBox1;
end;
-------------------------------------------
После этого эта ошибка вылезает и при закрытии приложения, и к Image'у
кстати тоже не обратиться (Access Violation). Похоже DLL-ка его
изнасиловала.
В общем расскажите, если знаете как это реализовать? Я уже замучился.
Диплом блин простаивает.