Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];
ВнизВызов DataModule из DLL. Найти похожие ветки
← →
em240 © (2008-01-10 12:20) [0]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.
← →
Сергей М. © (2008-01-10 12:27) [1]
> DLL:
> program Project1;
Зашибись.
Да и весь нижеследующий код - в топку.
← →
sniknik © (2008-01-10 12:31) [2]да когда ж вы, извращенцы, кончитесь то?...
http://www.podgoretsky.com/DM/BadTips.html#BT-03
> Когда отключаю ShareMem, invalid pointer operation.
все правильно, так и должно быть. при разных менеджерах памяти, адрес одного для другого "invalid pointer" а операция с ним соответственно ...
так понимаю вы сильны в своих "извращенческих заблуждениях" и переубедить вас не пихать в dll что ни попадя не получится?
(пока что ни одного еще не получилось... очень уж сильно сия идея мозги разъедает...)
← →
em240 © (2008-01-10 12:32) [3]т.е. дял экспорта объектов лучше использовать сом?
← →
sniknik © (2008-01-10 12:33) [4]один MDI окна
http://delphimaster.net/view/2-1199647861/
другой датамодули... не дай бог с вами/вашими творениями работать.
← →
sniknik © (2008-01-10 12:34) [5]> т.е. дял экспорта объектов лучше использовать сом?
задача какая? что ты с помощью "экспорта объектов" добиться хочеш?
← →
Сергей М. © (2008-01-10 12:36) [6]
> em240 © (10.01.08 12:32) [3]
На то она и придумана.
← →
em240 © (2008-01-10 12:38) [7]
> sniknik © (10.01.08 12:31) [2]
> да когда ж вы, извращенцы, кончитесь то?...http://www.podgoretsky.
> com/DM/BadTips.html#BT-03> Когда отключаю ShareMem, invalid
> pointer operation.все правильно, так и должно быть. при
> разных менеджерах памяти, адрес одного для другого "invalid
> pointer" а операция с ним соответственно ...так понимаю
> вы сильны в своих "извращенческих заблуждениях" и переубедить
> вас не пихать в dll что ни попадя не получится? (пока что
> ни одного еще не получилось... очень уж сильно сия идея
> мозги разъедает...)
Изваращенец не я, это не моя идея :)
← →
sniknik © (2008-01-10 12:40) [8]> На то она и придумана.
но есть очень большая вероятность, что в данном случае не нужна и она... (не может же быть "экспорт объектов" самоцелью)
← →
Сергей М. © (2008-01-10 12:41) [9]
> это не моя идея
А идея использовать EXE в кач-ве DLL тоже не твоя ?)
> sniknik © (10.01.08 12:40) [8]
> в данном случае не нужна и она
Скорее всего так оно и есть.
← →
em240 © (2008-01-10 12:44) [10]
> А идея использовать EXE в кач-ве DLL тоже не твоя ?)
???
Нужно чтобы датамодуль могли использовать несколько приложений.
← →
Сергей М. © (2008-01-10 12:48) [11]
> Нужно чтобы датамодуль могли использовать несколько приложений
Да на здоровье !
Но в проектах динамически линкуемых библиотек в первой строчке должно фигурировать library, но никак не program
← →
sniknik © (2008-01-10 12:52) [12]> Нужно чтобы датамодуль могли использовать несколько приложений.
см. трехзвенка, remotedatamodule (возможны ошибки в написании...)
это один из вариантов действительно совместного использования... (один из, этим не ограничивается)
хотя возможно ты имеешь ввиду просто общий модуль, который подключают при компиляции разные приложения, а работать они бы стали все одно автономно... тагда вообще ничего делать не надо, модуль уже есть, положи его в общую папка и используй для всех приложений каких заблагорассудится.
← →
Сергей М. © (2008-01-10 12:57) [13]
> Нужно чтобы датамодуль могли использовать несколько приложений
Разработанных искл-но в Делфи ?
Тогда зачем stdcall ?
Кр.того, зачем self везде понатыкан ?
Почему используются разные декларации класса TDataModule2 ?
TReturnDataModule - это что за абракадабра, где и как объявлена ?
← →
em240 © (2008-01-10 12:57) [14]
> Сергей М. © (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:59) [15]
> em240
И вообще - для экспорта объектов дельфийских классов Борланд предоставил механизм пакетов (BPL)
← →
em240 © (2008-01-10 13:00) [16]
> Сергей М. © (10.01.08 12:59) [15]
> > em240 И вообще - для экспорта объектов дельфийских классов
> Борланд предоставил механизм пакетов (BPL)
Прблема в том,что часть софта написана вижуалке, часть на дэлфи.
← →
Сергей М. © (2008-01-10 13:02) [17]
> часть софта написана вижуалке
Что есть "вижуалка" ?
Откуда "вижуалка" знает о существовании в природе дельфийских классов и объектов ?
← →
sniknik © (2008-01-10 13:05) [18]> //ShareMem,
зря закоментарил, если передаешь классы то другого способа как общий менеджер памяти нет. а это в свое очередь налагает ряд ограничений, таких как разработка исключительно под дельфи, и вроде конкретную версию (не точно. но вот использовать другой типа fastmmm, точно не получится, а в старших версиях дельфи он принят по умолчанию).
т.е. ты фактически пишешь связку программа-dll, и нигде в другом месте эту dll использовать не удастся.
← →
em240 © (2008-01-10 13:05) [19]
> Сергей М. © (10.01.08 13:02) [17]
> > часть софта написана вижуалкеЧто есть "вижуалка" ?Откуда
> "вижуалка" знает о существовании в природе дельфийских классов
> и объектов ?
В приложении, написанном на VS(MFC), необходимо работать с формами delphi приложения.
← →
Palladin © (2008-01-10 13:06) [20]хочешь сказать в VS ты описал тип TDataModule2? :) ну и бред...
COM конечно...
← →
em240 © (2008-01-10 13:07) [21]
> sniknik © (10.01.08 13:05) [18]
> > //ShareMem,зря закоментарил, если передаешь классы то
> другого способа как общий менеджер памяти нет. а это в свое
> очередь налагает ряд ограничений, таких как разработка исключительно
> под дельфи, и вроде конкретную версию (не точно. но вот
> использовать другой типа fastmmm, точно не получится, а
> в старших версиях дельфи он принят по умолчанию).т.е. ты
> фактически пишешь связку программа-dll, и нигде в другом
> месте эту dll использовать не удастся.
Экспериментировал
← →
sniknik © (2008-01-10 13:07) [22]> В приложении, написанном на VS(MFC), необходимо работать с формами delphi приложения.
с этого надо было начинать. см. COM, ActivX, интерфейсы. это общее для всей винды.
← →
Сергей М. © (2008-01-10 13:08) [23]
> em240 © (10.01.08 13:05) [19]
Что значит "работать" ?
COM как раз и придумана для взаимодействия модулей, разработанных в разных средах разработки.
← →
em240 © (2008-01-10 13:09) [24]
> Palladin © (10.01.08 13:06) [20]
> хочешь сказать в VS ты описал тип TDataModule2? :) ну и
> бред...COM конечно...
там ещё и форма будет.
если форма вызывается из MFC приложения, то нужен и ДМ и форма.
если из Дэлфи приложения, то Датамодуль.
← →
Palladin © (2008-01-10 13:11) [25]как все жестоко...
← →
Сергей М. © (2008-01-10 13:11) [26]
> em240 © (10.01.08 13:09) [24]
Тем дальше в лес, тем толще партизаны)
Надо понимать, ты как разработчик ДЛЛ знаешь откуда была вызвана экспортируемая тобой функция ?
← →
em240 © (2008-01-10 13:13) [27]
> Сергей М. © (10.01.08 13:11) [26]
> > em240 © (10.01.08 13:09) [24]Тем дальше в лес, тем толще
> партизаны)Надо понимать, ты как разработчик ДЛЛ знаешь откуда
> была вызвана экспортируемая тобой функция ?
т.е.?
← →
em240 © (2008-01-10 13:15) [28]
> sniknik © (10.01.08 13:07) [22]
> > В приложении, написанном на VS(MFC), необходимо работать
> с формами delphi приложения.с этого надо было начинать.
> см. COM, ActivX, интерфейсы. это общее для всей винды.
ОК.
← →
Сергей М. © (2008-01-10 13:15) [29]
> em240 © (10.01.08 13:13) [27]
Что "т.е." ?
В своей библ-ке ты объявил/реализовал/экспортиоровал ф-цию
function ReturnDM:TDataModule2;stdcall;
begin
.. здесь как ты собрался определять, откуда вызвана твоя ф-ция ? ...
end;
← →
Palladin © (2008-01-10 13:17) [30]
> [29] Сергей М. © (10.01.08 13:15)
да видимо разные функции будут вызываться в зависимости от инструмента разработки :)
← →
sniknik © (2008-01-10 13:17) [31]> то Датамодуль.
датамодуль тебе не пойдет чтобы в VS его использовать, нужно чтото вроде ядра ADO (т.е. полностью COM обьект, или тот же remotedatamodule, правда с собственной реализацией передачи данных (вряд ли у тебя есть дока по этим, или каким другим обьектам. дока, до уровня протоколов, а не по использованию.))
← →
Сергей М. © (2008-01-10 13:18) [32]
> Palladin © (10.01.08 13:17) [30]
Мда уж)
← →
em240 © (2008-01-10 13:18) [33]
> Palladin © (10.01.08 13:17) [30]
> > [29] Сергей М. © (10.01.08 13:15)да видимо разные функции
> будут вызываться в зависимости от инструмента разработки
> :)
да
Всё будет через сом.
← →
Сергей М. © (2008-01-10 13:19) [34]
> Всё будет через сом
Быстро же ты оглобли заворачиваешь)
← →
em240 © (2008-01-10 13:23) [35]:)
Истина рождается в споре :)
← →
Сергей М. © (2008-01-10 13:25) [36]
> Истина рождается в споре
Мне просто любопытно, как ты вознамерился сочетать
"Нужно чтобы датамодуль могли использовать несколько приложений"
и
"через СОМ"
← →
Игорь Шевченко © (2008-01-10 14:01) [37]Это все конечно хорошо и можно сделать через DLL, но вот такой вопрос - откуда приложение на Vusual-что-то узнает о том, что на свете есть такая вещь, как датамодуль ?
Тут и COM не поможет :)
← →
em240 © (2008-01-10 14:02) [38]Поменяю структуру Дэлфи приложения.
← →
sniknik © (2008-01-10 14:57) [39]> Тут и COM не поможет :)
см. [31], поможет, если сделать собственный на интерфейсах.
> Поменяю структуру Дэлфи приложения.
пахнет не сменой структуры приложения, а полной заменой базовых(не БД имеется ввиду...) вещей из генофонда. готов написать свой VCL? и ради чего?
(может хоть этот "не уйдет". переубедиться. ;о))
← →
em240 © (2008-01-10 15:25) [40]
> sniknik © (10.01.08 14:57) [39]
> > Тут и COM не поможет :)см. [31], поможет, если сделать
> собственный на интерфейсах.> Поменяю структуру Дэлфи приложения.
> пахнет не сменой структуры приложения, а полной заменой
> базовых(не БД имеется ввиду...) вещей из генофонда. готов
> написать свой VCL? и ради чего?(может хоть этот "не уйдет".
> переубедиться. ;о))
ок, Ваше предложение.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.042 c