Спасибо за информацию.
Сейчас вычисления в DLL проходят нормально и результаты я использую в основной программе, но при закрытии программы вылетает ошибка чтения памяти. Может надо какой ресурс очистить?
Код ниже
Это общий класс DLL и основной программы
Код:
unit uExchange;
interface
uses SysUtils;
const
F1_COUNT = 67;
F2_COUNT = 21;
F5_COUNT = 10;
type
TKoef = Record
name: String;
abbr: String;
val_bgn: Currency;
val_end: Currency;
delta: Currency;
criterion: boolean;
cr_type: integer;
cr_min: Currency;
cr_max: Currency;
dev_bgn: boolean;
dev_end: boolean;
dev_bgn_val: Currency;
dev_end_val: Currency;
info: String;
valid: boolean;
end;
TMKoef = array of TKoef;
TModule = Record
id: integer;
koef_count: integer;
mKoef: TMKoef;
isCalc: Boolean;
end;
TOrganization = record
FileName: String;
Name: String;
Address: String;
Ruk: String;
RukPhone: String;
Buh: String;
BuhPhone: String;
INN: String;
KPP: String;
EMail: String;
BankName: String;
BankBIK: String;
BankKS: String;
OKPO: String;
OKVED: String;
Information: String;
f1: array[1..4,1..F1_COUNT] of String;
f2: array[1..4,1..F2_COUNT] of String;
f5: array[1..4,1..F5_COUNT] of String;
modules: array of TModule;
end;
implementation
...
end.
Это DLL
Код:
library module1;
uses uExchange, SysUtils;
function GetModuleData(var O: TOrganization; module_number:integer): Boolean; stdcall;
begin
with O.modules[module_number].mKoef[0] do begin
...
end;
with O.modules[module_number].mKoef[1] do begin
...
end;
Result := True;
end;
exports GetModuleData;
begin
end.
И код программы
Код:
public
ORG: TOrganization;
...
GetModuleData: function(var O: TOrganization; module_number: integer): Boolean; stdcall;
...
procedure TfMain.mModuleCalcClick(Sender: TObject);
begin
try
try
hDLL := LoadLibrary(PAnsiChar(FN));
@GetModuleData := nil;
if hDLL >= 32 then begin
@GetModuleData := GetProcAddress(hDLL,'GetModuleData');
if (@GetModuleData<>nil) then begin
GetModuleData(ORG, 0) then begin
end;
end;
finally
@GetModuleData := nil;
FreeLibrary(hDLL);
end;
except
end;
end;
...