Пожалуйста!!!Помогите!!! Ситуация такая: есть .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;
var
i: Integer;
go_exit : Boolean;
zz1, zz3 : _STARTUPINFOA;
zz2, zz4 : _PROCESS_INFORMATION;
begin
Application.Minimize;
ReadIni('S_ASCHET');
// Обработаем S_ASCHEF
Application.Title := 'Перенос S_ASCHEF на сервер';
//Form1.Refresh;
i := 0;
DataModule2.table1.TableName := OUT_FILE_ASCHEF;
DataModule2.table1.Active := False;
DataModule2.table1.Exclusive := True;
repeat
try
go_exit := True;
DataModule2.table1.Active := True;
except
begin
DataModule2.table1.Active := False;
i := i + 1;
Application.Title := 'Перенос S_ASCHEF на сервер. Попыток: ' + inttostr(i);
// Form1.Refresh;
sleep(1000 * 3);
go_exit := False;
end;
end;
until go_exit;
DataModule2.table1.Active := False;
copyfile(PChar(INTER_DIR + '\S_ASCHEF.DBF'), PChar(OUT_FILE_ASCHEF), False);
// Для S_ASCHEF закончили
// Для ТРЦ — закрытые счета (OFFICE.dbf)
Application.Title := 'Перенос OFFICE на сервер';
//Form1.Refresh;
//ReadIni('BIPRINT');
i := 0;
DataModule2.table1.TableName := OUT_FILE_CLOSE;
DataModule2.table1.Active := False;
DataModule2.table1.Exclusive := True;
repeat
try
go_exit := True;
DataModule2.table1.Active := True;
except
begin
DataModule2.table1.Active := False;
i := i + 1;
Application.Title := 'Перенос OFFICE на сервер. Попыток: ' + inttostr(i);
// Form1.Refresh;
sleep(1000 * 3);
go_exit := False;
end;
end;
until go_exit;
DataModule2.table1.Active := False;
copyfile(PChar(INTER_DIR + '\OFFICE.DBF'), PChar(OUT_FILE_CLOSE), False);
// Для ТРЦ — закрытые счета (OFFICE.dbf) ЗАКОНЧИЛИ!
// Обработаем S_ASCHET
Application.Title := 'Перенос S_ASCHET на сервер';
//Form1.Refresh;
i := 0;
DataModule2.table1.TableName := OUT_FILE_ESC_SOFI;
DataModule2.table1.Active := False;
DataModule2.table1.Exclusive := True;
repeat
try
go_exit := True;
DataModule2.table1.Active := True;
except
begin
DataModule2.table1.Active := False;
i := i + 1;
Application.Title := 'Перенос S_ASCHET на сервер. Попыток: ' + inttostr(i);
// Form1.Refresh;
sleep(1000 * 3);
go_exit := False;
end;
end;
until go_exit;
DataModule2.table1.Active := False;
copyfile(PChar(INTER_DIR + '\S_ASCHET.DBF'), PChar(OUT_FILE_ESC_SOFI), False);
zz3.dwFlags := STARTF_USESHOWWINDOW;
zz3.wShowWindow := SW_SHOWMINIMIZED;
CreateProcess(PChar(sc.BeforeRev('\', {ParamStr(0)}'C:\WORK\REFERENCE\исх\Interface_ip_right\dll\inface.ini') + '\FOX\CRE_IND1.EXE'),
nil, nil, nil,
False,
CREATE_DEFAULT_ERROR_MODE, nil,
PChar(sc.BeforeRev('\', {ParamStr(0)}'C:\WORK\REFERENCE\исх\Interface_ip_right\dll\inface.ini')), zz3, zz4);
// BNKSEEK
Application.Title := 'Перенос BNKSEEK на сервер';
//Form1.Refresh;
ReadIni('BNKSEEK');
i := 0;
copyfile(PChar(IN_ + '\BNKSEEK.DBF'), PChar(INTER_DIR + '\BNKSEEK.DBF'), False);
DataModule2.table1.TableName := OUT_FILE_ESC_SOFI;
DataModule2.table1.Active := False;
DataModule2.table1.Exclusive := True;
repeat
try
go_exit := True;
DataModule2.table1.Active := True;
except
begin
DataModule2.table1.Active := False;
i := i + 1;
Application.Title := 'Перенос BNKSEEK на сервер. Попыток: ' + inttostr(i);
// Form1.Refresh;
sleep(1000 * 3);
go_exit := False;
end;
end;
until go_exit;
DataModule2.table1.Active := False;
copyfile(PChar(INTER_DIR + '\BNKSEEK.DBF'), PChar(OUT_FILE_ESC_SOFI), False);
// Для ESC-SOFI закончили
// Запускаем создание индексов
zz1.dwFlags := STARTF_USESHOWWINDOW;
zz1.wShowWindow := SW_SHOWMINIMIZED;
CreateProcess(PChar(sc.BeforeRev('\', {ParamStr(0)}'C:\WORK\REFERENCE\исх\Interface_ip_right\dll\inface.ini') + '\FOX\CRE_IND2.EXE'),
nil, nil, nil,
False,
CREATE_DEFAULT_ERROR_MODE, nil,
PChar(sc.BeforeRev('\', {ParamStr(0)}'C:\WORK\REFERENCE\исх\Interface_ip_right\dll\inface.ini')), zz1, zz2);
// Индексы создаются
// Для BiPrint
Application.Title := 'Перенос BNKSEEK для BiPrint на сервер';
//Form1.Refresh;
ReadIni('BIPRINT');
i := 0;
//copyfile(PChar(IN_ + '\BNKSEEK.DBF'), PChar(INTER_DIR + '\BNKSEEK.DBF'), False);
DataModule2.table1.TableName := OUT_DIR_BIPRINT + '\bnkseek.dbf';
DataModule2.table1.Active := False;
DataModule2.table1.Exclusive := True;
repeat
try
go_exit := True;
DataModule2.table1.Active := True;
except
begin
DataModule2.table1.Active := False;
i := i + 1;
Application.Title := 'Перенос BNKSEEK для BiPrint на сервер. Попыток: ' + inttostr(i);
// Form1.Refresh;
sleep(1000 * 3);
go_exit := False;
end;
end;
until go_exit;
DataModule2.table1.Active := False;
copyfile(PChar(IN_ + '\BNKSEEK.DBF'), PChar(OUT_DIR_BIPRINT + '\bnkseek.dbf'), False);
copyfile(PChar(IN_ + '\BNKSEEK_.CDX'), PChar(OUT_DIR_BIPRINT + '\bnkseek_.cdx'), False);
copyfile(PChar(IN_ + '\KORREK.DBF'), PChar(OUT_DIR_BIPRINT + '\korrek.dbf'), False);
zz1.dwFlags := STARTF_USESHOWWINDOW;
zz1.wShowWindow := SW_SHOWMINIMIZED;
CreateProcess(PChar(sc.BeforeRev('\', {ParamStr(0)}'C:\WORK\REFERENCE\исх\Interface_ip_right\dll\inface.ini') + '\FOX\CRE_IND3.EXE'),
nil, nil, nil,
False,
CREATE_DEFAULT_ERROR_MODE, nil,
PChar(sc.BeforeRev('\', {ParamStr(0)}'C:\WORK\REFERENCE\исх\Interface_ip_right\dll\inface.ini')), zz1, zz2);
// Для BiPrint закончили
//////////////////////////////////////////////////////////////
// *********************************************************//
//////////////////////////////////////////////////////////////
// Справочник банков
// Формируем BANKS.DBF для сканера
ReadIni('BNKSEEK');
Application.Title := 'Перенос BANKS на сервер';
//Form1.Refresh;
with DataModule2 do begin
Query1.SQL.Strings[2] := 'FROM "' + in_ + '\BNKSEEK.DBF" bnkseek';
Query1.SQL.Strings[5] := 'FULL OUTER JOIN "' + in_ + '\TNP.DBF" tnp';
Query1.ExecSQL;
BatchMove1.Source := Query1;
BatchMove1.Mappings.Text := 'NAME=NAME' + #13+#10 + 'BIC=NEWNUM' + #13+#10 + 'KS=KSNP' + #13+#10 + 'ADRES=ADRES';
table2.TableName := INTER_DIR + '\banks.dbf';
table2.Active := True;
BatchMove1.Execute;
table2.Active := False;
i := 0;
table1.TableName := OUT_FILE_SCANER;
table1.Exclusive := True;
repeat
try
go_exit := True;
DataModule2.table1.Active := True;
except
begin
DataModule2.table1.Active := False;
i := i + 1;
Application.Title := 'Перенос BANKS на сервер. Попыток: ' + inttostr(i);
// Form1.Refresh;
sleep(1000 * 3);
go_exit := False;
end;
end;
until go_exit;
DataModule2.table1.Active := False;
copyfile(PChar(INTER_DIR + '\banks.dbf'), PChar(OUT_FILE_SCANER), False);
end;
end;
function ReadIni(ASection : String) : String;
var
sIniFile: TIniFile;
// sPath : String[60];
const
S = 'xyz'; { стандартная строка для выдачи ошибок чтения }
begin
// sPath := ParamStr(0);
// GetDir(0,sPath);
sIniFile := TIniFile.Create({sPath + '}'C:\WORK\REFERENCE\исх\Interface_ip_right\dll\Inface.INI');
IN_ := sIniFile.ReadString(ASection, 'IN', S);
INTER_DIR := sIniFile.ReadString(ASection, 'INTER_DIR', S);
OUT_FILE_ESC_SOFI := sIniFile.ReadString(ASection, 'OUT_FILE_ESC_SOFI', S);
OUT_FILE_SCANER := sIniFile.ReadString(ASection, 'OUT_FILE_SCANER', S);
OUT_FILE_CLOSE := sIniFile.ReadString(ASection, 'OUT_FILE_CLOSE', S);
if ASection = 'S_ASCHET' then
begin
OUT_FILE_TRANS := sIniFile.ReadString(ASection, 'OUT_FILE_TRANS', S);
OUT_FILE_ASCHEF := sIniFile.ReadString(ASection, 'OUT_FILE_ASCHEF', S);
end;
if ASection = 'BIPRINT' then
OUT_DIR_BIPRINT := sIniFile.ReadString(ASection, 'OUT_DIR_BIPRINT', S);
sIniFile.Free;
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.
_____________________________________________________