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.


em240   (2008-01-10 13:09:00) [21]


> Palladin ©   (10.01.08 13:06) [20]
> хочешь сказать в VS ты описал тип TDataModule2? :) ну и
> бред...COM конечно...

там ещё и форма будет.
если форма вызывается из MFC приложения, то нужен и ДМ и форма.
если из Дэлфи приложения, то Датамодуль.


Сергей М.   (2008-01-10 13:08:00) [22]


> em240 ©   (10.01.08 13:05) [19]


Что значит "работать" ?

COM как раз и придумана для взаимодействия модулей, разработанных в разных средах разработки.


sniknik   (2008-01-10 13:07:00) [23]

> В приложении, написанном на VS(MFC), необходимо работать с формами delphi приложения.
с этого надо было начинать. см. COM, ActivX, интерфейсы. это общее для всей винды.


em240   (2008-01-10 13:07:00) [24]


> sniknik ©   (10.01.08 13:05) [18]
> > //ShareMem,зря закоментарил, если передаешь классы то
> другого способа как общий менеджер памяти нет. а это в свое
> очередь налагает ряд ограничений, таких как разработка исключительно
> под дельфи, и вроде конкретную версию (не точно. но вот
> использовать другой типа fastmmm, точно не получится, а
> в старших версиях дельфи он принят по умолчанию).т.е. ты
> фактически пишешь связку программа-dll, и нигде в другом
> месте эту dll использовать не удастся.

Экспериментировал


Palladin   (2008-01-10 13:06:00) [25]

хочешь сказать в VS ты описал тип TDataModule2? :) ну и бред...
COM конечно...


em240   (2008-01-10 13:05:00) [26]


> Сергей М. ©   (10.01.08 13:02) [17]
> > часть софта написана вижуалкеЧто есть "вижуалка" ?Откуда
> "вижуалка" знает о существовании в природе дельфийских классов
> и объектов ?

В приложении, написанном на VS(MFC), необходимо работать с формами delphi приложения.


sniknik   (2008-01-10 13:05:00) [27]

> //ShareMem,
зря закоментарил, если передаешь классы то другого способа как общий менеджер памяти нет. а это в свое очередь налагает ряд ограничений, таких как разработка исключительно под дельфи, и вроде конкретную версию (не точно. но вот использовать другой типа fastmmm, точно не получится, а в старших версиях дельфи он принят по умолчанию).
т.е. ты фактически пишешь связку программа-dll, и нигде в другом месте эту dll использовать не удастся.


Сергей М.   (2008-01-10 13:02:00) [28]


> часть софта написана вижуалке


Что есть "вижуалка" ?
Откуда "вижуалка" знает о существовании в природе дельфийскихклассов и объектов ?


em240   (2008-01-10 13:00:00) [29]


> Сергей М. ©   (10.01.08 12:59) [15]
> > em240 И вообще - для экспорта объектов дельфийских классов
> Борланд предоставил механизм пакетов (BPL)

Прблема в том,что часть софта написана вижуалке, часть на дэлфи.


Сергей М.   (2008-01-10 12:59:00) [30]


> em240


И вообще - для экспорта объектов дельфийских классов Борланд предоставил механизм пакетов(BPL)


em240   (2008-01-10 12:57:00) [31]


> Сергей М. ©   (10.01.08 12:48) [11]
> > Нужно чтобы датамодуль могли использовать несколько приложенийДа
> на здоровье !Но в проектах динамически линкуемых библиотек
> в первой строчке должно фигурировать library, но никак не
> program

Это модуль из которого экспортируется функция....

library Project2;

{ Important note about DLL memory management: ShareMem must be the
 first unit in your library's USES clause AND your project's (select
 Project-View Source) USES clause if your DLL exports any procedures or
 functions that pass strings as parameters or function results. This
 applies to all strings passed to and from your DLL--even those that
 are nested in records and classes. ShareMem is the interface unit to
 the BORLNDMM.DLL shared memory manager, which must be deployed along
 with your DLL. To avoid using BORLNDMM.DLL, pass string information
 using PChar or ShortString parameters. }

uses
 //ShareMem,
 SysUtils,
 Classes,
 Unit2 in 'Unit2.pas' {DataModule2: TDataModule};
exports ReturnDM;
end.


Сергей М.   (2008-01-10 12:57:00) [32]


> Нужно чтобы датамодуль могли использовать несколько приложений


Разработанных искл-но в Делфи ?
Тогда зачем stdcall?

Кр.того, зачем selfвезде понатыкан ?
Почему используются разныедекларации класса TDataModule2 ?
TReturnDataModule - это что за абракадабра, где и как объявлена ?


sniknik   (2008-01-10 12:52:00) [33]

> Нужно чтобы датамодуль могли использовать несколько приложений.
см. трехзвенка, remotedatamodule (возможны ошибки в написании...)
это один из вариантов действительно совместного использования... (один из, этим не ограничивается)

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


Сергей М.   (2008-01-10 12:48:00) [34]


> Нужно чтобы датамодуль могли использовать несколько приложений


Да на здоровье !

Но в проектах динамически линкуемых библиотек в первой строчке должно фигурировать library, но никак не program


em240   (2008-01-10 12:44:00) [35]


> А идея использовать EXE в кач-ве DLL тоже не твоя ?)

???

Нужно чтобы датамодуль могли использовать несколько приложений.


Сергей М.   (2008-01-10 12:41:00) [36]


> это не моя идея


А идея использовать EXE в кач-ве DLL тоже не твоя ?)


> sniknik ©   (10.01.08 12:40) [8]


> в данном случае не нужна и она


Скорее всего так оно и есть.


sniknik   (2008-01-10 12:40:00) [37]

> На то она и придумана.
но есть очень большая вероятность, что в данном случае не нужна и она... (не может же быть "экспорт объектов" самоцелью)


em240   (2008-01-10 12:38:00) [38]


> sniknik ©   (10.01.08 12:31) [2]
> да когда ж вы, извращенцы, кончитесь то?... http://www.podgoretsky.
> com/DM/BadTips.html#BT-03> Когда отключаю ShareMem, invalid
> pointer operation.все правильно, так и должно быть. при
> разных менеджерах памяти, адрес одного для другого "invalid
> pointer" а операция с ним соответственно ...так понимаю
> вы сильны в своих "извращенческих заблуждениях" и переубедить
> вас не пихать в dll что ни попадя не получится? (пока что
> ни одного еще не получилось... очень уж сильно сия идея
> мозги разъедает...)

Изваращенец не я, это не моя идея :)


Сергей М.   (2008-01-10 12:36:00) [39]


> em240 ©   (10.01.08 12:32) [3]


На то она и придумана.


sniknik   (2008-01-10 12:34:00) [40]

> т.е. дял экспорта объектов лучше использовать сом?
задача какая? что ты с помощью "экспорта объектов" добиться хочеш?


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

Наверх

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