Problem z DLL - Access violation ...

0

Mam pytanie - wiem, że śmieszne ale .... :P Ucze się dopiero pisania DLL.

{ DLL }
library CODEX_DLL;

function CODEX(const TextIn: AnsiString; const Key: Byte): AnsiString; StdCall;
var
  I : Cardinal;
begin
  Result := TextIn;

  for I := 1 to Length(TextIn) do
  begin
    Result := Result + Chr(Ord(TextIn[I]) xor Key);
  end;
end;

exports
  CODEX;

begin
end.

i teraz w programie mam tak:

...
  public
    { Public declarations }
  end;

function CODEX(const TextIn: AnsiString; const Key: Byte): AnsiString; StdCall
          external 'CODEX.DLL';

var
  Form1: TForm1;
...

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Text := CODEX(Memo1.Text, 181);
end;

i "wywala" mi błąd:
Access violation at adress 003825D6 in module 'CODEX.DLL'. Read of address 00000000.

O co chodzi? [???] A jak pozmieniam troche to wyskakuje błąd Invallid pointer ...

Prosze o pomoc wiem, że to wina mojej DLL'ki... :| ;(

0

Staraj się nie przekazywać długich łańcuchów (AnsiString, często również string - przy włączonej dyrektywie bodajże $H+) jako parametrów do procedur/funkcji do biblioteki DLL. W przypadku ich używania musisz na pierwszym miejscu w dyrektywie ues biblioteki DLL umieścić moduł ShareMem, a to wymaga obecności biblioteki BorldMM.dll (chyba tak się nazywała) na komputerze, na którym zainstalujesz aplikację (biblioteka instaluje się standardowo z Delphi). Zamiast typu string (AnsiString) skorzystaj z PChar lub z klasycznego pascalowego stringa (ShortString lub string[n], n <= 255).

0

no z tym ShareMem i Borlndmm.dll to dobra odpowiedz ale przejscie do Pointerow nie zawsze pomaga a czasami to nawet program sie sypie jak snieg w zimie!!!!
Wartoby zmienic struktore programu i korzystac z jak najmniejszej ilosci bibliotek a jak sie nie da to.... wtedy trzeba koniecznie z sharemema korzystac. Zeby sie dowiedziac jak to poczytaj helpa.

0

Zejście do pointerów - chodzi Ci o PChar? Jeśli tak, to mnie ZAWSZE pomagało, jak miałem klasycznego stringa i sypał się program to zmieniałem na PChar i było cacy. Z tego co zauważyłem kiedyś-tam problemy występują też z interfejsami (myślę, że mogą być z każdą zmienną o kontrolowanym czasie życia). Przy okazji: zmienne lokalne mogą być długimi łańcuchami, więc zawsze możesz zrobić tak:

procedure JakasTam(Param:PChar);
var
  S: string;
begin
  S := Param;
  // teraz ładnie wykorzystujemy S zamiast Param :)

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