Показать сообщение отдельно
  #10  
Старый 03.10.2012, 13:04
Сергей77 Сергей77 вне форума
Прохожий
 
Регистрация: 14.05.2012
Сообщения: 31
Репутация: 10
По умолчанию

Спасибо за информацию.

Сейчас вычисления в 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;
...
Ответить с цитированием