Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов DataModule из DLL. [D7, WinXP]


Страницы:   1 2 3

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;


Зашибись.

Да и весь нижеследующий код - в топку.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо