dll i tablica jako parametr procedury

0

Witam,
Mam troche dziwny (jak dla mnie :) ) problem. W bibliotece dll mam zadeklarowaną procedure:

procedure Klasa.Procedura(tablica: Pointer); stdcall;

procedura ma ustawić długość tablicy (zmienna 'tablica') i cos do niej przypisać. treść procedury:

type TTablica = array of String; // wczesniej zadeklarowany typ 'pomocniczy'
...
  begin
      SetLength(TTablica(tablica^), 1);  // ustawienei dlugosci na 1 element
      TTablica(tablica^)[0] := 'zglasza sie dll'; // przypisanie do 1-go elementu pewnego lancucha znakow
  end;

wywołanie w programie głównym:

var tmp: array of string;
  begin
    Klasa.Procedura(@tmp);
  end;

jesli chodzi o całą klasę w dll to wszytko jest ok, tylko problem zaczyna się w lini:

SetLength(TTablica(tablica^), 1);
  • wywala 'InvalidPointer'. próbowałem już na różne sposoby z tymi wskaźnikami ale nic nie wychodzi. jak mam procedure w programie głównym to wszystko jest OK.

ponawiam pytanie

0

wystarczy troche poszukac i poczytac ze uzywanie stringow pomiedzy dll a exe (lub innym dll) wywoluje bledy. masz dwie mozliwosci: zamiana na PChar lub dodanie do uses w biblioteczce modulu ShareMem ale potem musisz dodawac do swojego progsa specjalna biblioteczke :)

0

Nie, to chyba nie to. O ile się nie mylę, to dereferencja wskaźnika amorficznego jest zabroniona :>

0

to nie chodzi tylko o długie łańcuchy. dałem array of integer i dalej to samo. wskaźniki chyba sa ok. dalem samo integer (nie array) i wsyzstko poszlo bez problemow. dalem tez sharemem w uses no i to tez cos dalo, jednak nie do konca, przy wylaczaniu progrmau jest Invalid Pointer. z tablicami jest problem i nie wiem jak to rozwiazac :)

0

Spróbuj tak:

type
  TTablica = array of string;
  PTablica = ^TTablica;
...
  begin
      SetLength(PTablica(Tablica)^, 1);
      (PTablica(Tablica)^)[0] := 'zglasza sie dll';
  end;
0

jesli wywolam procedure progu glownego z parametrem Tmp: TTablica, Procedure(@tmp...) to dalej jest to samo, jesli z parametrem Tmp: PTablica, Procedure(Tmp...) to nic sie nie dzieje, w bibliotece dll 'zatrzymuje' sie przy setlength i nie wykonuje wiecej zadnej operacji ale nie wywala bledu.

0

Nie powinno sie nic takiego przesylac do DLL ani w druga strone. Szczegolnie jak nie znasz zasady dzialania tablic dynamicznych (czyz nie?), dllka moze miec np swoja sterte i wskaznik nie wskazuje na informacje o tablicy.

0

dziekuje Wolverine za pouczajaca odpowiedz :)

0

btw. jeżeli będziesz chciał skorzystać ze statycznej tablicy to pamiętaj, żeby indeksować ją od zera a nie od jednego, bo w drugim przypadku program będzie źle działał - nie wiem czemu; wiem to z doświadczenia...

0

ściągnij sobie moduł FastShareMem, dodaj go do exe i dll (na pierwszym miejscu w uses) i możesz spokojnie przekazywać do dll jako parametr tablicę dynamiczną bez żadnych dodatkowych bibliotek w stylu borlandmm.dll

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