![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблемы перехода от exe к dll [D5, NT4]
Tori © (2005-10-22 18:08:00)Пожалуйста!!!Помогите!!! Ситуация такая: есть .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.
_____________________________________________________
Tori (2005-10-23 09:26:00) [1]Спасибо большое! Буду стараться.
isasa (2005-10-22 19:00:00) [2]
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-22 18:41:00) [3]Понимаете ли в чем дело...dll я никогда не писала. Как это делается - не знаю, потому и спрашиваю. Меня смущает что компиляция успешна как в случае с .exe файлом так и в случае с .dll файлом, хотя последний реализует в точности те же функции что и первый. Где в .dll файле указывается тип вызова функции? В строке exports..., в строке var... или непосрдственно перед описанием функции или и там, и там, и там? Мне нужен вызов StdCall.
isasa (2005-10-22 18:22:00) [4]Ну что можно сказать? Ты бы хоть коментарии вычистил.
1. Разберись как вызываешь MyFunction - sdtcall, или как обычно(register).
2. Кто инициирует Application в модуле DLL?
palva (2005-10-22 18:19:00) [5]А почему при описании функции MyFunction в одном случае есть StdCall, а в другом - нет?