Текущий архив: 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.042 c