Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1196332511
Tornado
2007-11-29 13:35
2008.02.03
Установка EhLib


15-1199110257
Aust
2007-12-31 17:10
2008.02.03
Новый год, уже


15-1198146235
antonn (work)
2007-12-20 13:23
2008.02.03
хочу raid1


2-1199427867
Master
2008-01-04 09:24
2008.02.03
Проблемы с рисованием


15-1198321867
Kostafey
2007-12-22 14:11
2008.02.03
С днем рождения ! 22 декабря





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский