Brak parenta w dll = błąd

0

Witam.

Napisałem sobie taką oto dll'ke:
library Hash;

uses
  DCPcrypt2, DCPmd5, SysUtils, Classes;

function HashString(sSrc: string; var sDest: string): Boolean;
var
  md5: TDCP_md5;
  Digest: array[0..15] of byte;
  i: integer;
begin
  try
    md5 := TDCP_md5.Create(nil);
    md5.Init;
    md5.UpdateStr(sSrc);
    md5.Final(Digest);
    md5.Burn;
    md5.Free;
    sDest := '';
    for i := 0 to 15 do
      sDest := sDest + IntToHex(Digest[i], 2);
    Result := True;
  except
    try md5.Burn; md5.Free except end;
    Result := False;
  end;
end;

exports
  HashString;

begin
end.

Jak teraz w aplikacji deklaruję funkcje:

function HashString(sSrc: string; var sDest: string): Boolean; external 'Hash.dll' name 'HashString';

to wszystko dziala.

Gdy tą funkcje wywołuje z biblioteki to wysypują się errory. Jeśli jednak przeniosę ją z biblioteki do aplikacji i jako parenta obiektu TDCP_md5 dam fMain (forme główna mojej aplikacji) zamiast nil tak jak jest w dll'ce to wszystko dziala bez błedu.

I teraz pytanie.
Jak zrobić zeby to działało z dll'ki? Bo w dll'ce nie mam co dać za parenta.

0

jak widzę string używany w dll'ce i brak ShareMem w uses, to ciarki mnie przechodzą. przeczytałeś komentarz, który Delphi dokleja na początku kodu źródłowego każdej nowej biblioteki? popatrz sobie na niego tutaj: Biblioteki DLL

0

a stdcall gdzie??

0
Misiekd napisał(a)

a stdcall gdzie??

stdcall chyba nie jest konieczny o ile dll'ka będzie wykorzystywana również w Delphi. Aczkolwiek jestem zwolennikiem żeby zawsze jawnie określać sposób przekazywania parametrów.
Obstawiam:

  • na nieumieszczenie ShareMem (jak napisał ŁF)
  • sprawdź sobie w źródłach klasy które wykorzystujesz czy podanie jako parametru kontruktora nil'a coś tutaj nie psoci. Być może klasa potrzebuje się odowłać do obiektu Application. Pytanie czy przepinasz do dll'ki obiekty Application, Screen z głównego programu ?

Zrób sobie dla testów inną funkcję (np z message box'em) żeby sprawdzić, czy wszystko inne jest OK (ładowanie dll'ki ...)

Aha i tak ogólnie rzecz biorąc, to lepiej stosować PChar'y zamiast tych string'ów.

0

klasa korzysta z konstruktora klasy TComponent

0

<ort>Sprubuj </ort>nadpisać obiekt Application w dll'u obiektem z exe'ka, oczywiście na końcu to przywróć. Przykłady powinny być w pierwszej lepszej książce do Delphi, rodział DLL.

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