![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов DataModule из DLL. [D7, WinXP]
em240 © (2008-01-10 12:20:00)DLL:
program Project1;
uses
ShareMem,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Unit2;
interface
uses
SysUtils, Classes, DB, ADODB;
type
TDataModule2 = class(TDataModule)
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
private
{ Private declarations }
public
Constructor Create(AOwner:TComponent);override;
{ Public declarations }
end;
var
DataModule2: TDataModule2;
function ReturnDM:TDataModule2;stdcall;
implementation
{$R *.dfm}
Constructor TDataModule2.Create(AOwner:TComponent);
begin
Inherited;
Self.ADODataSet1.Prepared:=true;
Self.DataSource1.Enabled:=true;
end;
function ReturnDM:TDataModule2;
begin
Result:=TDataModule2.Create(nil);
end;
end.
Приложение:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls,DB,ADODB;
type
TDataModule2 = class(TDataModule)
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
private
//function ReturnDS1:longInt;virtual;stdcall;abstract;
{ Private declarations }
public
{ Public declarations }
end;
TReturnDataModule=function:TDataModule2;stdcall;
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
DM:TDataModule2;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
DS:TReturnDataModule;
LibHandle:THandle;
begin
LibHandle:=LoadLibrary('Project2.dll');
try
if LibHandle=0 then begin
ShowMessage('No DLL');
Exit;
end;
@DS:=GetProcAddress(LibHandle,'ReturnDM');
DM:=DS;
try
Self.DBGrid1.DataSource:=DM.DataSource1;
except
On E:Exception do
ShowMessage(E.Message);
end;
finally
FreeLibrary(LibHandle);
end;
end;
end.
Ошибка Access violation(c ShareMem).
Когда отключаю ShareMem, invalid pointer operation.
sniknik (2008-01-10 12:33:00) [41]один MDI окна
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1199647861&n=18
другой датамодули... не дай бог с вами/вашими творениями работать.
em240 (2008-01-10 12:32:00) [42]т.е. дял экспорта объектов лучше использовать сом?
sniknik (2008-01-10 12:31:00) [43]да когда ж вы, извращенцы, кончитесь то?...
http://www.podgoretsky.com/DM/BadTips.html#BT-03
> Когда отключаю ShareMem, invalid pointer operation.
все правильно, так и должно быть. при разных менеджерах памяти, адрес одного для другого "invalid pointer" а операция с ним соответственно ...
так понимаю вы сильны в своих "извращенческих заблуждениях" и переубедить вас не пихать в dll что ни попадя не получится?
(пока что ни одного еще не получилось... очень уж сильно сия идея мозги разъедает...)
Сергей М. (2008-01-10 12:27:00) [44]
> DLL:
> programProject1;
Зашибись.
Да и весь нижеследующий код - в топку.