Delphi - procedury w dll ( lista jednokierunkowa )

0

Witam, z góry powiem, że moja wiedza na temat programowania jest znikoma :) mam problem dotyczący biblioteki DLL, a dokładniej mam program operujący na liście jednokierunkowej ( coś ala baza danych ). Całą listę jak i operacje ( dodawanie, usuwanie, sortowanie itp. ) mam w oddzielnym Unicie o nazwie LISTA i moim zadaniem jest stworzenie DLL i umieszczenie w nim kilku procedur operacji na tej liście albo na plikach ( zapis i odczyt listy do pliku ). Wszystkie operacje który posiadam działają prawidłowo. Umieściłem w DLL operacje zapisu do pliku.

Moja lista

unit lista;

interface

type

  koncertList = ^koncert;
  koncert = record

    data : string[10];
    wykonawca : string[32];
    miejscowosc : string[32];
    cena : string[32];
    sprzedaneb : string[32];
    koszt : string[32];
    nastepny : koncertList;
  end; 

DLL

procedure zapisz(filename : string); stdcall;

var
  plik : file of koncert;
  elem : koncertList;

begin
  elem := Root;
  //sciezka := Form1.SaveDialog1.FileName;
  AssignFile(plik, filename);
  Rewrite(plik);

  while elem <> nil do
  begin
    write(plik, elem^);
    elem := elem.nastepny;
  end;

  CloseFile(plik);

end; 

no i odwołanie się do DLL

 procedure zapisz(filename : string); external 'dll.dll';

wszystko się kompiluje tylko przy aktywowaniu operacji zapisywanie wyskakuje błąd
I/O error 123

Bardzo bym prosił o pomoc :)

0

Kiedy utworzyłeś projekt DLL to widziałeś ten duży komentarz na początku? Przeczytałeś go?

0

średnio go rozumiem ...byłbym wdzięczny za pomoc ;)

0

Dopiero co był omawiany w innym wątku: Lista jednokierunkowa

{ 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. }

Znasz angielski? Więc przetłumacz; Nie znasz? Posłuż się Google;

1

Mniej więcej tam jest napisane że aby używać typu string w parametrach przekazywanych w pomiędzy DLL a aplikacją (pomiędzy DLL a inną DLL też) trzeba na 1 miejscu do uses dodać ShareMem zarówno w projekcie aplikacji (nie module w którym masz form (domyślnie unit1) tylko w module projektu Project --> View Source) jak i w DLL. A tak w ogóle to lepiej używać PChar lub ShortString nie trzeba sie wtedy pierniczyć z dodatkowa BORLNDMM.DLL.

0

dodałem tak jak mówisz ale nadal występuje ten błąd...czy w ogóle ten mój kod jest poprawny ?

0

Wyeksportowałeś w ogóle tą procedurę zapisz? Tu masz znakomity kursik Biblioteki DLL

0

exports jest ok :) a jeśli chodzi o Borlndmm.dll to jak dodać ją ?

0

Ustawić by była na ścieżce PATH lub wrzucić do folderu z programem.

0

Wrzuciłem do folderu z programem i bez zmian. Zmieniłem stringa na pchar i wyskakuje błąd 123.

0

Wyświetl sobie adres Root w głównym programie oraz w tej funkcji na początku.

0

jaśniej można o co dokładnie chodzi?

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