Program z bilioteką DLL

0

Witam, piszę na na zaliczenie program wraz z biblioteką DLL. Wszystkie funkcje w biliotece mam już napisane. Pojawia się problem z ich eksportem. Jeśli funkcje bym wrzucił, tak jak są do ciała programu to wszystkie działają jak należy, ale gdy importuje je z biblioteki DLL to tylko pierwsza działa ok, a reszta od razu wywala program przy wywołaniu funkcji. Wcześniej stosowałem import dynamiczny, teraz mam statyczny więc chyba zbyt wielu błędów zrobić nie mogłem. Będę ogromnie wdzięczny za jakieś sugestie. Tracę dużo czasu przez taką pierdołę :)

uses
  SysUtils,Windows;
type typ=array of array of shortstring;
function dochod(dane:typ):typ; stdcall; external 'DLLlib.DLL' name 'dochod';
procedure najmiasto(dane:typ) ;stdcall; external 'DLLlib.DLL' name 'najmiasto';
function zysk(dane:typ):typ ;stdcall; external 'DLLlib.DLL' name 'zysk';



exports

dochod,
najmiasto  ,
zysk ;

tak to wygląda w programie i w DLL

0

A ustawiasz rozmiar tablicy wynikowej w funkcjach DLL-ki przed przypisaniem do niej wyników, np:

 
SetLength(Result, 3);
SetLength(Result[0], 2);
SetLength(Result[1], 3);
SetLength(Result[2], 4);

?

Edit: warto też dać w DLL-ce na końcu nagłówka obu funkcji stdcall;

0

Dobrze by było zobaczyć nie tylko deklaracje ale i definicje tych funkcji; Bo z fusów Ci nikt nie wywróży;

0

jak tworzysz w delphi nowy moduł DLL to w komentarzu jest opisany problem, który dotyczy stringów. podejrzewam że ten sam problem dotyczy również tablic dynamicznych. proponuje dodać tą bibliotekę co tam napisali do uses (sharemem czy coś takiego). trzeba to dodać w dllu i w głównym kodzie źródłowym w pascalu (nie tym od formy) jako pierwszą pozycję. jak nie będzie Ci tak działać to tablice możesz zobić mniej więcej tak jak w C

0
Borland Delphi 7 napisał(a)

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

Moduł nazywa się ShareMem, sprawdź też to;

Ale jeżeli to nic nie pomoże to wklej tu kod tych funkcji, bo tak to można wymieniać do końca życia różne przyczyny...

0
 function najmiasto(dane:typ):typ;stdcall;
var
  wynik2:typ;
  Tab:array[0..49] of integer;
  npo,nwa,nwr,nsz,nkr,a,i,j:integer;
  po,wa,wr,sz,kr,max:extended;

begin
writeln('XXXXXXXXXXXXXXXXXXXXXXX');
  SetLength(wynik2,1);

    SetLength(wynik2[0],4);
  for i:=0 to high(dane) do
    Tab[i]:=StrToInt(dane[i][5])*StrToInt(dane[i][6])-strtoint(dane[i][7]);

   for i:=0 to high(Tab) do
   begin
    for j:=0 to high(dane) do
    begin
      if Tab[i]=StrToInt(dane[j][5])*StrToInt(dane[j][6])-strtoint(dane[j][7]) then
        begin
         if dane[j][1]='Poznan' then
          begin
                  po:=po+Tab[i];
                  npo:=npo+1
                  end;
          if dane[j][1]='Warszawa' then
                  begin
                  wa:=wa+Tab[i];
                  nwa:=nwa+1
                  end;
          if dane[j][1]='Wroclaw' then begin
                  wr:=wr+Tab[i];
                  nwr:=nwr+1
                  end;
          if dane[j][1]='Szczecin' then begin
                  sz:=sz+Tab[i];
                  nsz:=nsz+1
                  end;
          if dane[j][1]='Krakow' then begin
                  kr:=kr+Tab[i];
                  nkr:=nkr+1
                  end;

        end;
       end;
      end;
  if npo<>0 then
 po:=po/npo;
 if nwa<>0 then
 wa:=wa/nwa;
 if nwr<>0 then
 wr:=wr/nwr;
 if nsz<>0 then
 sz:=sz/nsz;
 if nkr<>0 then
 kr:=kr/nkr;

 if po>wa then
  max:=po
  else wa:=max;
 if wr>max then
  max:=wr;
 if sz>max then
  max:=sz;
 if kr>max then
  max:=kr;
  if max=po then
  wynik2[0][0]:='Poznan';
  //writeln('Poznan');
  if max=wa then
  wynik2[0][0]:='Warszawa';
  //writeln('Warszawa');
  if max=wr then
  wynik2[0][0]:='Wroclaw';
  //writeln('Wroclaw');
  if max=sz then
  wynik2[0][0]:='Szczecin';
  //writeln('Szczecin');
  if max=kr then
  wynik2[0][0]:='Krakow';
  //writeln('Krakow')
  wynik2[0][1]:='tam zarabiono srednio najwiecej, bo';
  wynik2[0][2]:=FloatToStr(max);
  wynik2[0][3]:='zl';
Result:=wynik2;

end;
function zysk(dane:typ;zespol:string):typ;stdcall;
var
wynik:typ;
s,miasto1,miasto2:string;
i,min,max:integer;
begin
s:=zespol;
min:=high(integer);
for i:=0 to 49 do
  if  (dane[i][0])=s then
    if StrToInt(dane[i][6])<min then
      begin
      min:=StrToInt(dane[i][6]);
      miasto1:=dane[i][1];
      end;

for i:=0 to 49  do
  if  dane[i][0]=s then
    if StrToInt(dane[i][5])*StrToInt(dane[i][6])-strtoint(dane[i][7])>max then
      begin
      max:=StrToInt(dane[i][5])*StrToInt(dane[i][6])-strtoint(dane[i][7]);
      miasto2:=dane[i][1];
      end;
SetLength(wynik,2);
for i:=0 to 1 do
  SetLength(wynik[i],5);
wynik[0][0]:=miasto1;
wynik[0][1]:='tam na';
wynik[0][2]:=s;
wynik[0][3]:='tylko';
wynik[0][4]:=IntToStr(min);
wynik[1][0]:='miejscem najoplacalniejszego koncertu grupy';
wynik[1][1]:=s;
wynik[1][2]:='byl';
wynik[1][3]:=miasto2;

SetLength(Result,1);

    SetLength(Result[0],4);

Result:=wynik;

tak wygląda funkcja z którą mam problem

0

Kryzys zazegnany, wszystko działa, więc raz jeszcze dzieki za pomoc

0

No to napisz chociaż gdzie był błąd; Może komuś się to jeszcze przydać jak szukając odpowiedzi natrafi na ten post;

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