Biblioteka nie ma dostępu do głównego programu

0

Kwestia taka, że mam program (w nim memo1) i bibliotkę DLL, w sposób statyczny ładuję bibliotekę i chcę, by ona wpisała w memo cokolwiek no np "nic".

DLLka:

library Strings;
{[...]}

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Gauges, ExtCtrls,
  Unit1 in '..\Unit1.pas' {Form1};

{$R *.res}
procedure MemoFill; stdcall;
var
  Form1 : TForm1;
    Memo1: TMemo;
begin
  MessageBox(0, 'Procedura uruchomiona', 'Informacja!', MB_OK);
form1.memo1.text:='nic';
end;

I program główny (z wyciętym tym, co było niepotrzebne)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Gauges, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure MemoboxFill; stdcall external 'Data/Strings.dll' name 'MemoFill';

implementation

{$R *.dfm}


procedure TForm1.ComboBox2Change(Sender: TObject);  //<- Tu nie Combochancge tylko Guzik 
begin
MemoFill;
end;


end.

I kwestia taka, że po wciśnięciu guzika, pokazuje się info że "Procedura uruchomiona" a potem pada, zawsze wyskakuje mi błąd "Access violition at adress 003CC6A6 in module 'Strings.dll'. Read of adress D08B0000"

0

jest odpowiedz na to pytanie na tym forum i innym.

Pomysl, czym jest zmienna i jak sie do niej odwolujesz ? Co z tego ze ma ta sama nazwe.
Generalnie podstawy na temat deklarowania zmiennych i ich widocznosci w pascalu (nawet nie delphi, tu nie ma znaczenia czy jest to forma czy tez nie.

Dla uproszczenia przypadek


procedure MemoFill; stdcall;
var
  Zmienna1 : string;
begin  
  Zmienna1 :='nic';
end;
program jakis;

procedure MemoboxFill; stdcall external 'Data/Strings.dll' name 'MemoFill';

var
  Zmienna1:string;
begin
 Zmienna1 := 'cos w niej mamy';
 MemoFill;
end.
0

@reichel albo ktos inny prośba, prosił bym również o odpowiedź, bo ja mało kodowałem używając
bibliotek dll, więc też pytam. Czy da się w ogóle zrobić takie coś że komponent z głownej formy, ale
ładujący osobną dllkę, może ustawić tekst lub inne własności na przykład komponentu TMemo???
Czy trzeba robić tak, że jakaś funkcja zwraca PChar i ten rezultat jest ustawiany jako Memo.Text???
Bo na Biblioteki DLL nie ma przykładu jak obsłużyć jakiś
komponent wizualny czy go stworzyć od nowa i pokazać na Formatce, o ile w ogóle się da. A chyba
tak, bo kiedyś pamiętam coś podobnego zrobiłem, ale nie pamiętam jak, bo nie zapisałem kodu ;-/

0

reichel - właśnie tylko że moim założeniem było, że dllka zawiera w sobie jakąś informację, która ma być wpisana w memo w głównym programie i to DLLka ma w sobie procedure wpisania tej informacji w program główny (nie wiem, czy to możliwe, ale wydaje mi się, że taka własnie jest funkcja tych dllek.)

Czy to znaczy, że DLLka nie jest wstanie wpisać w memo jakiegoś tekstu, a jedynie sprawić by zmienna będąca już w tym programie została tam wpisana??

0

np.

library strings;

uses
  SysUtils,
  StdCtrls,
  Classes;

{$R *.res}

procedure MemoFill(var m: TMemo); stdcall;

begin
  if not assigned(m) then exit;
  m.text := 'nic';
end;
exports MemoFill;
begin

end.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure MemoboxFill(var m:TMemo); stdcall external 'Strings.dll' name 'MemoFill';

procedure TForm1.Button1Click(Sender: TObject);
begin
     MemoboxFill(Memo1);
end;

end.
0

Dzięki. Teraz działa, nie wiem dlaczego wcześniej mi nie chciało, chyba przez brak słowa kluczowego
var w parametrach dla procedury. Bo jak wiem z kursu na 4programmers to słowa var należy użyc w
procedurze lub funkcji kiedy zawartość zmiennej będzie w niej modyfikowana. Jeszcze raz dziękuję :)

EDIT: bez słowka var także działą, nie wiem widocznie coś Delphi źle działało, nieraz tak mam zę jak w
programie były jakies Acess Violatony to Delphi 7 pisze że klucz wygasł i trzeba zrestartować całe IDE.

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