problem z dll

0

Uruchamiam formularz z parametrami ktory jest w dll

var
  DLL : THandle;
  Wydruk : procedure(id_p:integer;id_k:byte;data,datapon:TDate;inne:ShortString);
  d1,d2 : TDate;
begin
  DLL:=0;
  DLL:=LoadLibrary('lib\print.dll');
  try
    if DLL<>0 then begin
      d1:=dataLE.Date;
      d2:=Waznosc;
      @Wydruk:=GetProcAddress(DLL,'Wydruk');
      if @Wydruk<> nil then Wydruk(1,8,d1,d2,'01/02/01/01.01');
    end else
    ShowMessage(LoadMessage(83));
  finally
    FreeLibrary(DLL);
  end;
end;

I uruchamia sie ok.
Ale gdy koncze juz caly program to dostaje blad:
Exception EAccessViolation in module prog.exe ...

o co biega?

0
  1. ShareMem jest w uses exe i dll??
  2. Application i Screen dll <> exe
    może kawałek kodu z dll :>
0
library print;
uses
  ShareMem,
  SysUtils,
  Classes,
  Forms,
  Dialogs,
  Controls,
  Wydruk_dll in 'Wydruk_dll.pas' {WydrukFdll};

{$R *.res}

procedure Wydruk(Pacjent:TPacjent;Praca:TPraca;id_k:byte;data,datapon:TDate);
begin
  WydrukFdll:=TWydrukFdll.Create(Application);
  ShowMessage(Pacjent.pesel);
  WydrukFdll.id_karty:=id_k;
  WydrukFdll.data:=data;
  WydrukFdll.datapon:=datapon;
  WydrukFdll.Pacjent:=Pacjent;
  WydrukFdll.ShowModal;
  WydrukFdll.Free;

end;

exports Wydruk name 'Wydruk';

begin
end.

Tu i tu jest sharemem. a Twojego drugiego punktu nie kumam :)

0
Wydruk : procedure(id_p:integer;id_k:byte;data,datapon:TDate;inne:ShortString);

procedure Wydruk(Pacjent:TPacjent;Praca:TPraca;id_k:byte;data,datapon:TDate);

Deklaracje różnią się. Muszą być identyczne.
Sharemem jest potrzebne tylko do stringów i tablic dynamicznych, tu nie ma ani jednego, ani drugiego, jest tylko standardowy shortstring, więc sharemem można wywalić.

0

Teraz już są takie same ale błąd ten sam.
ShareMem mam bo w typie TPacjent są stringi ;P

0

Witajcie forumowicze.
Podepne się pod temat...
Mam problem z uruchomieniem formy z dll-a, chodzi o to że pierw napisałem program (forma) który uruchamiam przez wywołanie funkcji w dll-u.
Problem występuje przy zamknięciu programu uruchomionego z dll-a,
pierwszy błąd to "Instrukcja spod "0x003730de" odwołuje się do pamięci pod adresem "0x00995da8". Pamięć nie może być "read" "
kolejny jest podobnej treści, różni się tylko adresami, a ostatni trzeci co wyskakuje to "Runtime error 216 at 00373270"
Prosze o sugestje co robie źle.

Funkcja w dll wygląda tak :

library synchronizacja_czasu;

uses
forms,okno;

{$R *.res}

function synchronizuj_czas():Boolean; stdcall;
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
Result := True;
end;

exports
synchronizuj_czas name 'synchronizuj_czas';

begin
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1