Dll i funkcja z parametrem.

Odpowiedz Nowy wątek
2004-06-06 10:23

Rejestracja: 17 lat temu

Ostatnio: 5 lat temu

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.


Słowa kierownika : To, jak wy zdążycie to napisać, to ja mam w szeroko rozumianej du*ie.
http://project1.pl

Pozostało 580 znaków

2004-06-06 10:27

Rejestracja: 16 lat temu

Ostatnio: 1 rok temu

0
var
  PokazKomunikat: procedure(parametry);

poprostu dwie różne deklaracje

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


Pozostało 580 znaków

2004-06-06 10:36

Rejestracja: 15 lat temu

Ostatnio: 11 lat temu

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

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


Pozostało 580 znaków

2004-06-06 15:37

Rejestracja: 17 lat temu

Ostatnio: 1 miesiąc temu

0

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


+1 post

Pozostało 580 znaków

2004-06-06 16:35

Rejestracja: 17 lat temu

Ostatnio: 5 lat temu

0

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


Słowa kierownika : To, jak wy zdążycie to napisać, to ja mam w szeroko rozumianej du*ie.
http://project1.pl

Pozostało 580 znaków

2004-06-06 16:48

Rejestracja: 17 lat temu

Ostatnio: 7 lat temu

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);

Pozostało 580 znaków

2004-06-06 17:59

Rejestracja: 17 lat temu

Ostatnio: 5 lat temu

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.


Słowa kierownika : To, jak wy zdążycie to napisać, to ja mam w szeroko rozumianej du*ie.
http://project1.pl

Pozostało 580 znaków

Odpowiedz

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