[Delphi]Blad przy wywolaniu procki z dll

0

tak wyglada procedura zawarta w bibliotece dll


procedure ReadMain; stdcall;
begin
// ShowMessage('dad');
Form_Main.BmpTrackBar1.Position:=1;
end;
exports
ReadMain;

a tak jej wywołanie w głównym programie


procedure TForm_Main.Image5Click(Sender: TObject);
var
h:Cardinal;
f:procedure;stdcall;
begin

h:=LoadLibrary(PChar(ExtractFilePath(Application.ExeName)+'Proc.dll'));

if(h<>0)then
begin
@f:=GetProcAddress(h,'ReadMain');

if(@f<>nil)then
begin
f;
end;

end;
end;

wywala acces violationa , gdy zamiast przypisania wartosci w procedurce dll uzyje showmessag-a w tej chwili będącego w komentarzach to jest ok. w jaki sposób powinno się robić takie przypisanie</b>

0

Zdaje mi sie ze wywala blad bo odwolujesz sie do Formy bezposredni ja bym robil na uchwytach ale malo wiem o DLL wiec ... :(

0

Po pierwsze to h nie Cardinal tylko THandle, po drugie to stdcall przy deklarowani procedure f: procedure; stdcall; nie jest chyba potrzebne, a poza tym to brakuje jeszcze FreeLibary(h); nie wiem czy to usunie błąd czy nie ale tak czy siak to powinno byc poprawione ;)

0

dzieki,ale po poprawieniu błędów i tak wywala błąd

ma ktoś jakieś inne pomysły ?

0

Po pierwsze to h nie Cardinal tylko THandle

type
  THandle = Integer;

Wartości ujemne nigdy nie są zwracane, a integer i cardinal mają po 4bajty, różnią się tylko bitem znaku, więc cardinal bez problemu może tu być.

Moim zdaniem dllka nie wie co jest w Form_Main, tzn wie ale dla niej jest tam jakaś inna wartość niż powinna stąd bład AV. Dopisz do funkcji parametr, przekazując wskaźnik do formy, lub lepiej (w tym przypadku) - do trackbara.

0

na wskaznikach nie udalo mi sie nic wskurać-za mało wiem w tej dzidzinie

Wsk:^TForm;
Wsk:=@Form_Main;
podejrzewam że tak będzie wyglądać pobranie adresu formy,ale gdy w procedurze w dll piszę tak:

procedure ReadMain(Wsk:^TForm);stdcall;
to wyskakuje : identifier expected but ^ found , więc to powinno się jakoś inaczej zapisać

próbowałem zapisać procedurę w ten sposób (zrezygnowałem ze zmiany parametru trackbara żeby było prościej)

procedure ReadMain(Forma:TForm);stdcall;
begin
Forma.Left:=10;
end;

i wyskakuje ten sam błąd,proszę o pomoc bo ja raczej sobie z tym nie poradze

0

Wsk:^TForm;
Wsk:=@Form_Main;

Tak nie może być - Twoja forma i tak jest innej klasy - zobacz jaka jest nazwa klasy Twojej formy .. - już pewnie ją zmodyfikwałeś w DFM więc to jest źle.

procedure ReadMain(Wsk:^TForm);stdcall;
to wyskakuje : identifier expected but ^ found , więc to powinno się jakoś inaczej zapisać

Trzeba sobie typ zadeklarować PForm = ^TForm;

A tak w ogóle to nie trzeba przekazywać form przez wskaźniki do nich - Delphi i tak przekazuje je niejawnie (polecam poszukać: klasy jako parametry)

0

w dfm jest

object Form_Main: TForm_Main

więc spróbowałem bez jawnego przekazywania wskaźników,przekazać klasę jako
Forma:TForm_Main

dalej wywala błąd,czy ktoś mógłby pomóc i najlepiej wstawić kawałek kodu jak to ma wyglądać,wiem , że to nieładnie ale naprawde sporo już nad tym wysiedziałem

0

Z przekazaniem formy możesz mieć problem, gdyż dll musiałby includować plik pas z formą żeby wiedzieć co na niej jest, ale dla np. TButton to tak (w uses musisz mieć StdCtrls):

// deklarujesz
  procedure ReadMain(var Baton: TButton);stdcall;
  begin
    Baton.Caption := 'urabura';
  end;
// wywołujesz
  ReadMain(Button1);

I powinno pykać.

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