![]() |
| ||
|
|
Новости |
Поиск |
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.
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]> т.е. дял экспорта объектов лучше использовать сом?
задача какая? что ты с помощью "экспорта объектов" добиться хочеш?