Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

проблемы перехода от exe к dll   Найти похожие ветки 

 
Tori ©   (2005-10-22 18:08) [0]

Пожалуйста!!!Помогите!!! Ситуация такая: есть .exe файл реализующий определенный набор функций. Возникла необходимость "закатать" его (определенный набор функций) в .dll файл. Код тот же самый. Компиляция и того и другого проекта успешна. Что я делаю не так - не знаю. Такое ощущение что программа не выходит из какого-то цикла. Системный блок начинает возмущенно пищать. Помогите разобраться. Пишу на Delphi 5. Привожу проект .dll файла и проект .exe файла в котором производится его вызов. И ещё хотелось бы узнать каким образом можно отладить проект .dll файла? Первый раз пишу .dll файл и ничего не выходит :(
Проект .dll файла
--------------------------------------------------------------------------------
library Project1;

uses
 ShareMem,
 SysUtils,
 Classes,
 Unit1 in "Unit1.pas" {DataModule2: TDataModule},
 Unit2 in "Unit2.pas" {Form2};

{$R *.RES}

exports MyFunction;

begin
end.
---------------------------------------------------------------------------------
unit Unit1;

interface

uses
 ShareMem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Db, DBTables, StdCtrls, IniFiles, ShellAPI, TMon, Tornado, strcon;

type
 TMyTread = class(TThread)
 protected
   procedure Execute; override;
 end;

type
 TDataModule2 = class(TDataModule)
   Table1: TTable;
   Table2: TTable;
   BatchMove1: TBatchMove;
   Query1: TQuery;
   TableLocal: TTable;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 DataModule2: TDataModule2;

var
 IN_, INTER_DIR, OUT_FILE_ESC_SOFI, OUT_FILE_SCANER, OUT_FILE_TRANS, OUT_FILE_ASCHEF, OUT_DIR_BIPRINT, OUT_FILE_CLOSE :String;
   potok1: TMyTread;
 function ReadIni(ASection : String) : String;
 function MyFunction(const sPash:string) : string;

implementation
uses Unit2;

{$R *.DFM}

procedure TMyTread.Execute;

end;

function ReadIni(ASection : String) : String;

end;

function MyFunction(const sPash:string):string; export;
begin
try
{potok1 := TMyTread.Create(True);
potok1.FreeOnTerminate := True;
potok1.OnTerminate := Form1.OnDestroy;
potok1.Priority := tpIdle ;
potok1.Resume;}
       begin
 Application.Initialize;
 Application.CreateForm(TDataModule2, DataModule2);
 Application.CreateForm(TForm2, Form2);
 Application.Run;
       Form2.Visible:=True; // для события TForm2.OnShow прописан тот же обработчик что и для TForm2.Button1Click
       Result:=sPash;
       end;
except
       begin
       Result:="0";
       Application.Terminate;
       end;
end;
end;

end.
______________________________________________________________________________________________________
unit Unit2;

interface

uses
 ShareMem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm2 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   procedure Button1Click(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation
uses Unit1;

{$R *.DFM}

{procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=MyFunction("1");
end;}

procedure TForm2.Button1Click(Sender: TObject);
begin
potok1 := TMyTread.Create(True);
potok1.FreeOnTerminate := True;
potok1.OnTerminate := Form2.OnDestroy;
potok1.Priority := tpIdle ;
potok1.Resume;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
Application.Terminate;
end;

end.
Проект файла .exe в котором производится вызов файла .dll
program Project2;

uses
 Forms,
 Unit1 in "Unit1.pas" {Form1};

{$R *.RES}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.
-----------------------------------------------------------------------------------------
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Unit2;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption:=MyFunction("1");
end;

end.
-------------------------------------------------------------------------------------------------
unit Unit2;

interface

function MyFunction(const sPash:string):string; StdCall;

implementation

function MyFunction;        external "Project1.dll" name "MyFunction";

end.
_____________________________________________________


 
palva ©   (2005-10-22 18:19) [1]

А почему при описании функции MyFunction в одном случае есть StdCall, а в другом - нет?


 
isasa ©   (2005-10-22 18:22) [2]

Ну что можно сказать? Ты бы хоть коментарии вычистил.
1. Разберись как вызываешь MyFunction - sdtcall, или как обычно(register).
2. Кто инициирует Application в модуле DLL?


 
Tori ©   (2005-10-22 18:41) [3]

Понимаете ли в чем дело...dll я никогда не писала. Как это делается - не знаю, потому и спрашиваю. Меня смущает что компиляция успешна как в случае с .exe файлом так и в случае с .dll файлом, хотя последний реализует в точности те же функции что и первый. Где в .dll файле указывается тип вызова функции? В строке exports..., в строке var... или непосрдственно перед описанием функции или и там, и там, и там? Мне нужен вызов StdCall.


 
isasa ©   (2005-10-22 19:00) [4]


unit Unit1;  // DLL unit

interface
...
function ReadIni(ASection : String) : String; stdCall;
function MyFunction(const sPash:string) : string; stdCall;

=======================
unit Unit2;  // EXE unit

interface
..
function ReadIni(ASection : String) : String; stdCall;
function MyFunction(const sPash:string) : string; stdCall;
...

не надо

Application.Initialize;
Application.CreateForm(TDataModule2, DataModule2);
Application.CreateForm(TForm2, Form2);
Application.Run;

надо

DataModule2Ж=TDataModule2.Create(...
Form2:=TForm2.Create(...

ну и почитать, яего нибудь, про DLL - загрузка, адресное пространство DLL, ...


 
Tori ©   (2005-10-23 09:26) [5]

Спасибо большое! Буду стараться.



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.836 c
2-1130324382
Stanislav
2005-10-26 14:59
2005.11.13
Как получить НД при ассинх. выполнении запроса


2-1129802515
Андрей__
2005-10-20 14:01
2005.11.13
DBLookUpComboBox


2-1130307297
pic509
2005-10-26 10:14
2005.11.13
как узнать номер созданной записи


3-1128347433
Антон1209
2005-10-03 17:50
2005.11.13
параметры TSQLDataSet


9-1120128161
u-12
2005-06-30 14:42
2005.11.13
2д аркады..