Dll i funkcja z parametrem.

0

Niech ktoś mi bez zbędnych komentarzy powie, jak z dll'a wywołać funckję albo procedurę z parametrem. Mam taką bibliotekę :

library biblioteka;
uses
  Windows, Dialogs;
{$R *.RES}
procedure PokazKomunikat; stdcall;
begin
    ShowMessage('wywołana');
end;
exports Pokazkomunikat name 'PokazKomunikat';
begin
end.

i jak próbuję ją wywołać tak jak nakazuje logika, czyli :

var
 DLL : THandle;
 PokazKomunikat: procedure;
begin
 DLL := LoadLibrary('biblioteka.dll');
 try
  @PokazKomunikat := GetProcAddress(DLL, 'PokazKomunikat');
  if @PokazKomunikat = nil then showmessage('Nie można blablabla.');
  PokazKomunikat('blabla'); //<<-- <font color=red>tutaj błąd</font>
 finally
  FreeLibrary(DLL);
 end;
end;

to się nie kompiluje - Too many actual parameters.
Tak więc podzielcie się swoją wiedzą. Wiedzę poprzyjcie jakimś małym przykładem.

0
var
  PokazKomunikat: procedure(parametry);

po prostu dwie różne deklaracje

Ale tu nie chodzi o deklaracje w dll, tylko w programie

0
procedure PokazKomunikat; stdcall;
// popatrz dalej
PokazKomunikat('blabla'); //<<-- <font color=red>tutaj błąd</font>

chyba wiesz w czym jest problem :-D
po prostu dwie różne deklaracje

0

albo w bib dodaj parametr s:string (i odp deklaracje) albo wywal to ('blabla') z kodu programu

0

Obawiam się, że żadna z waszych sugestii nie zadziałała. Prosze o dalsze propozycje.

0

Wielki problem... Chyba widać, że jak deklaracja nie zgadza się z wywołaniem, to bedą błędy. A ty deklarację masz zdecydowanie inną, niż wywołanie.

w bibliotece:

procedure PokazKomunikat(cos:pchar); stdcall;

i jak próbuję ją wywołać tak jak nakazuje logika, czyli :

w programie:

PokazKomunikat:procedure(cos:pchar);
0

Dobra, zacznę prolem jeszcze raz, bo zauważyłem, że wkleiłem do posta nie ten kod biblioteki co trzeba. To wygląda tak (z uwzględenieniem waszych propozycji :

Biblioteka :

library biblioteka;
uses Windows;
{$R *.RES}
procedure PokazKomunikat(str : PChar); stdcall;
begin
 MessageBox(0, str, 'Witam!', MB_OK);
end;

exports Pokazkomunikat name 'PokazKomunikat';

begin
end.

Program :

var
 DLL : THandle;
 PokazKomunikat: procedure(str : PChar);
begin
 DLL := LoadLibrary('biblioteka.dll');
 try
  @PokazKomunikat := GetProcAddress(DLL, 'PokazKomunikat');
  if @PokazKomunikat = nil then showmessage('Nie można blablabla.');
  PokazKomunikat('Komunikat');
 finally
  FreeLibrary(DLL);
 end;
end;

Objawy :
Teraz po wykonaniu tego kodu ukazuje się tabliczka, ale z jakimiś krzakami zamiast tekstu będącego argumentem przy wywołanie PokazKomunikat. Po naciśnięciu OK, jak minie kilka sekund, wyskakuje "Program wykonał nieprawidłową operację i nastąpi jego zamknięcie. blablala".

Czekam na dalsze pomysły - wiem, że macie mnie już dość. [diabel]

Dobra, problem rozwiązany. Dla potomnych : W programie zamiast :

var
 DLL : THandle;
 PokazKomunikat: procedure(str : PChar);

Powinnno być :

var
 DLL : THandle;
 PokazKomunikat: procedure(str : PChar); stdcall;

Dzięki za zaangażowanie.

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