[Delphi] Obsługa wielu języków, problem z dll

0

W swoim programie chciałem wprowadzić obsługę języków. Jako pakiety językowe stosuje się pliki tekstowe o rozszerzeniu np. *.lng
Ja postanowiłem wykorzystać do tego celu bibliotekę DLL

Tutaj dokładnie opiszę co po kolei robiłem:

Stworzyłem plik *.rc:

{Kod pliku *.rc}
STRINGLIST
101, "Pierwszy tekst"
102, "Drugi tekst"
itd....
END

Skompilowałem go do pliku *.res i dodałem do zasobów biblioteki *.dll

{Kod biblioteki DLL}
library język;

{$R skompilowany_plik_rc.res}

begin
end.

Bibliotekę chciałem dodać do programu. Program Wykrywa DLL i dodaje do ListBoxa:

{Kawałek kodu programu}
procedure TForm3.FormCreate(Sender: TObject);
var sr: TSearchRec; czyKoniec: Integer;
begin
ListBox2.Items.Clear;
czyKoniec:=0;
FindFirst('Languages\*.dll',FaAnyFile,sr);
while czyKoniec=0 do
 begin
 ListBox2.Items.Add(sr.Name);
 czyKoniec:=FindNext(sr);
 end;
SysUtils.FindClose(sr);
end;

Wszystko szło bardzo fajnie, ale tylko do tego momentu :-(

 private
    { Private declarations }
        procedure Odpal;
.........

{Wywołanie OnClick ListBoxa}

procedure TForm3.ListBox2Click(Sender: TObject);
begin
if ListBox2.ItemIndex <> -1 then
Odpal;
end;
procedure TForm3.Odpal;
var
Name : String;
DLL     : THandle;                       
Buffer : array[0..255] of char;

begin   
 DLL := LoadLibrary(PChar(Name)); 
  try

LoadString(DLL, 101, Buffer, SizeOf(Buffer));
    Form1.Label1.Caption := Buffer;

LoadString(DLL, 102, Buffer, SizeOf(Buffer));
    Form1.Button1.Hint := Buffer;

itd...............

finally
    FreeLibrary(DLL);
  end;
end;

end.

Gdy klikam na jeden z Item-ów w ListBox-ie, biblioteka się nieładuje. Trochę modyfikowałem kod i też nic!!!

Czy ktoś z was wie jak to naprawić? Wydaje mi się, że nie trzeba wprowadzać dużych zmian. Prawdopodobnie jest błąd w procedurze "Odpal".

Liczę na waszą pomoc ;)

Nara!

0

po kliknięciu na name

name - słowo kluczowe języka Delphi

var
Name : String;
begin   
 DLL := LoadLibrary(PChar(Name));

a zmienną name (nazwij ją inaczej na wszelkie gdyby) gdzieś ustawiasz??

0

Nadal to samo :[
Biblioteka zostaje załadowana tylko wtedy, gdy:

LoadLibrary('biblioteka.dll');

ale przez:

var
Name : String;
begin   
 DLL := LoadLibrary(PChar(Name));

nie działa!!!
Z ListBox'a nie chce się załadować ;( Czy ktoś na forum miał podobny problem?

0

<font size="4">a zmienną name gdzieś ustawiasz??</span>

0

Przecież program sam wie co autor miał na myśli to po co ustawiać...

Jesli masz tak jak wyswietliłeś kod to twoja zmienna name nie ma wartosci (albo smieci albo ''), a jako taka nie moze poprawnei wczytac biblioteki...

0
daban napisał(a)

Przecież program sam wie co autor miał na myśli to po co ustawiać...

Jesli masz tak jak wyswietliłeś kod to twoja zmienna name nie ma wartosci (albo smieci albo ''), a jako taka nie moze poprawnei wczytac biblioteki...

Kod przepisałem do postu dokładnie i nic nie zmieniałem. Jeśli wiesz jak naprawić ten błąd, to wrzuć zmodyfikowany kod na forum. To by mi bardzo pomogło.

Za pomoc dziękuję.

0

No nie wierze...

procedure TForm3.ListBox2Click(Sender: TObject);
begin
  if ListBox2.ItemIndex <> -1 then
  Odpal(listBox2.Items[listBox2.ItemIndex]);
end;

procedure TForm3.Odpal(FileName: String);
var
  DLL     : THandle;                       
  Buffer : array[0..255] of char;
begin   
  DLL := LoadLibrary(PChar(FileName)); 
  try
    LoadString(DLL, 101, Buffer, SizeOf(Buffer));
    Form1.Label1.Caption := Buffer;
    .
    .
    .
finally
    FreeLibrary(DLL);
  end;
end;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.