Błąd przy ładowaniu pliku biblioteki

0

Witam. Umieściłem plik Resources zawierający grafiki JPEG w bibliotece DLL.
Przy próbie załadowania pliku .DLL kompilator wyświetla błąd:
[Error] RLINK32: Unsupported 16bit resource in file "ścieżka\Aplikacja\ResDLL.dll"

Procedura ładująca:

procedure TJPEGRes.LoadFromResource(const ResID: PChar);
var
  DLL: THandle;
  Res: TResourceStream;
begin
  DLL:= LoadLibrary('ResDLL.dll');
  Res:= TResourceStream.Create(hInstance, ResID, 'JPEGFILE');
  try
    LoadFromStream(Res);
  finally
    Res.Free;
  end;
end;
0

Przy próbie załadowania pliku .DLL kompilator wyświetla błąd

To kompilator ładuje ten plik? Bardzo ciekawe.

0

Nie napisałem, że kompilator ładuje plik, tylko wyświetla błąd.
Przy orzeczeniu nie użyłem podmiotu, gdyż wynika on z kontekstu (patrz kod) czyli jest nim zmienna-uchwyt - DLL.

0

Nie napisałem, że kompilator ładuje plik, tylko wyświetla błąd.
Przy orzeczeniu nie użyłem podmiotu, gdyż wynika on z kontekstu (patrz kod) czyli jest nim zmienna-uchwyt - DLL.

W polonistę się ze mną nie baw :P .
Ale racja, to nie jest to o co mi chodziło. Chodziło mi o to że nie jestem pewien czy to kompilator robi to co mówisz. Nie wiem czy to błąd kompilacji czy runtime. Wydaje mi się że skoro robisz 'LoadLibrary' to jest to typowo runtime i kompilator nie powinien ładować tej dllki. Więc nie zabardzo rozumiem kiedy i gdzie ten błąd.
A cały problem z tego że zapewne nie rozróżniasz słów kompilator a debugger.

Tak przy okazji, to nie jestem pewien czy można używać dowolnego typu resourca, bo mnie uczyli żeby używać tych paru podstawowych (RCDATA).

0

No nic, chyba zostanę przy pliku .RES, bo nie rozumiem skąd ten błąd. Skoro elementy pliku .RES bez problemu działały na formie, to dlaczego ten sam plik w bibliotece ma nie działać?

0

Spróbuj podmienić hInstance na DLL:

  DLL:= LoadLibrary('ResDLL.dll');
  Res:= TResourceStream.Create(hInstance, ResID, 'JPEGF
0

Z zasobów dllki powinno się ładować na przykłąd w taki sposób jak poniżej. W przykładzie ładuje png, ale może to być inny obsługiwany przez TImage czy inny komponent format, przy ewentualnym dodaniu wymaganych modułów, jak dla PNG w Delphi 7. Oczywiście dla Resourców o identyfikatorach zamiast nazw powinno się użyć konstruktora CreateFromID.

var
  H : Thandle;
  Img : TImage;
  PNG : TPNGImage;
  Stream : TResourceStream;
begin
  H := LoadLibrary('dllka.dll');
  if H <> 0 then
  begin
    PNG := TPNGImage.Create;
    Stream := TResourceStream.Create(H, 'cosik', RT_RCDATA);
    PNG.LoadFromStream(Stream);
    with TImage.Create(Self) do
    begin
      Parent := Self;
      Transparent := True;
      AutoSize := True;
      Left := 15;
      Top := 100;
      Name := 'Image1';
      Picture.Assign(PNG);
    end;
    FreeLibrary(H);
  end;
end;

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