![]() |
| ||
|
|
Новости |
Поиск |
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 19:52:00) [1]> я это через ком делал.
ТЫ, не делал! ты это автор ветки, который узнал про COM только сегодня, прямо из нее же. или хочеш сказать хватило двух с трех часов на овладение моделью COM и переписыванием датамодуля под нее? ХА два раза.
развод уровня детского сада. (хотя... мы же в нем (начинающих) и находимся... :)
vitv (2008-01-10 18:21:00) [2]я это через ком делал.
vitv (2008-01-10 18:20:00) [3]Подскажите народ!
sniknik (2008-01-10 18:09:00) [4]> ок, Ваше предложение.
оставь бредовые затеи, и займись наконец работой.
em240 (2008-01-10 15:25:00) [5]
> sniknik © (10.01.08 14:57) [39]
> > Тут и COM не поможет :)см. [31], поможет, если сделать
> собственный на интерфейсах.> Поменяю структуру Дэлфи приложения.
> пахнет не сменой структуры приложения, а полной заменой
> базовых(не БД имеется ввиду...) вещей из генофонда. готов
> написать свой VCL? и ради чего?(может хоть этот "не уйдет".
> переубедиться. ;о))
ок, Ваше предложение.
sniknik (2008-01-10 14:57:00) [6]> Тут и COM не поможет :)
см. [31], поможет, если сделать собственный на интерфейсах.
> Поменяю структуру Дэлфи приложения.
пахнет не сменой структуры приложения, а полной заменой базовых(не БД имеется ввиду...) вещей из генофонда. готов написать свой VCL? и ради чего?
(может хоть этот "не уйдет". переубедиться. ;о))
em240 (2008-01-10 14:02:00) [7]Поменяю структуру Дэлфи приложения.
Игорь Шевченко (2008-01-10 14:01:00) [8]Это все конечно хорошо и можно сделать через DLL, но вот такой вопрос - откуда приложение на Vusual-что-то узнает о том, что на свете есть такая вещь, как датамодуль ?
Тут и COM не поможет :)
Сергей М. (2008-01-10 13:25:00) [9]
> Истина рождается в споре
Мне просто любопытно, как ты вознамерился сочетать
"Нужно чтобы датамодуль могли использовать несколько приложений"
и
"через СОМ"
em240 (2008-01-10 13:23:00) [10]:)
Истина рождается в споре :)
Сергей М. (2008-01-10 13:19:00) [11]
> Всё будет через сом
Быстро же ты оглобли заворачиваешь)
em240 (2008-01-10 13:18:00) [12]
> Palladin © (10.01.08 13:17) [30]
> > [29] Сергей М. © (10.01.08 13:15)да видимо разные функции
> будут вызываться в зависимости от инструмента разработки
> :)
да
Всё будет через сом.
Сергей М. (2008-01-10 13:18:00) [13]
> Palladin © (10.01.08 13:17) [30]
Мда уж)
sniknik (2008-01-10 13:17:00) [14]> то Датамодуль.
датамодуль тебе не пойдет чтобы в VS его использовать, нужно чтото вроде ядра ADO (т.е. полностью COM обьект, или тот же remotedatamodule, правда с собственной реализацией передачи данных (вряд ли у тебя есть дока по этим, или каким другим обьектам. дока, до уровня протоколов, а не по использованию.))
Palladin (2008-01-10 13:17:00) [15]
> [29] Сергей М. © (10.01.08 13:15)
да видимо разные функции будут вызываться в зависимости от инструмента разработки :)
Сергей М. (2008-01-10 13:15:00) [16]
> em240 © (10.01.08 13:13) [27]
Что "т.е." ?
В своей библ-ке ты объявил/реализовал/экспортиоровал ф-цию
function ReturnDM:TDataModule2;stdcall;
begin
.. здеськак ты собрался определять, откуда вызвана твоя ф-ция ? ...
end;
em240 (2008-01-10 13:15:00) [17]
> sniknik © (10.01.08 13:07) [22]
> > В приложении, написанном на VS(MFC), необходимо работать
> с формами delphi приложения.с этого надо было начинать.
> см. COM, ActivX, интерфейсы. это общее для всей винды.
ОК.
em240 (2008-01-10 13:13:00) [18]
> Сергей М. © (10.01.08 13:11) [26]
> > em240 © (10.01.08 13:09) [24]Тем дальше в лес, тем толще
> партизаны)Надо понимать, ты как разработчик ДЛЛ знаешь откуда
> была вызвана экспортируемая тобой функция ?
т.е.?
Сергей М. (2008-01-10 13:11:00) [19]
> em240 © (10.01.08 13:09) [24]
Тем дальше в лес, тем толще партизаны)
Надо понимать, ты как разработчик ДЛЛ знаешь откуда была вызвана экспортируемая тобой функция ?
Palladin (2008-01-10 13:11:00) [20]как все жестоко...