Komponent w dll

0

Pytanie: Czy ktoś wie w jaki sposób skożystać z komponentu (np MyConnection z MyDAC) w pliku dll ale nie używając przy tym formy...
Z góry dzięki za podpowiedzi ;) [browar]
tak jest w dll:

type
  MyConnection1 = TMyConnection;
VAR
  MyConect:MyConnection1;

  Procedure conect;
  Var
  i:integer;
  s:string;
  Begin
   MyConect.Server:='localhost';
   MyConect.Username:= 'root';
   MyConect.Password:= 'root';
   MyConect.Database:= 'test';
   MyConect.Connected:=true;
  End;

exports
conect;

A tak w programie:

procedure TForm1.Button1Click(Sender: TObject);
VAR
uchwyt:THandle;
conect:procedure;stdcall;
begin
uchwyt:= LoadLibrary('Project12');
@conect:=GetProcAddress(uchwyt,'conect');
conect;
end;

No i co ja tutaj zrobiłem źle [???] [sciana] ;(

0

Masz wszystko zainicjalizowane i zdefiniowane tak jak powinno być?

0

Raczej tak...
Generalnie to samo zadeklarowane lokalnie działa bez zarzutu... :/ [???] [!!!]

0

a co dokladnie ci nie dziala? uzywasz tego polaczenia potem w dll czy w programie glownym?

0

Słuchaj no problem jest tego typu że napisałem sobie tych parę linijek kodu żeby sprawdzić czy to będzie działało. W momencie kiedy nacisnę przycisk czyli wykonam tą procedurę conect z dll mam acces violation :/ i nie wiem dlaczego...
Dla zainteresowanych daję link gdzie można pobrać owe 2 projekty... http://www.hanulak.neostrada.pl/DLL-DAC-dynamic.zip

0

dopisz do deklaracji procedury w dll na koncu STDCALL i powinno dzialac.

procedure conect; stdcall;

0

Niestety stdcall nic nie pomogło...

0

a masz w dll w uses na pierwszym miejscu ShareMem ??
i jeszcze jedno gdzie tworzysz to polaczenie? a najlepiej napisz na GG : 1017067 to pogadamy i ustalimy czego ci brakuje.

0

Nie miałem ale po dodaniu żadnych zmiam...
Przesyłam browara (poważnie) dla tego kto ten problem rozwikła!

0

a gdzie tworzysz obiekt MyConect? bo jezeli nie masz storzonego obiektu to bedzie sypal bledy. Jak mozerz to odezwij sie na gg to poroadzimy cos na to.

0

Niestety na gg w pracy nie mogę ale już sam sobie postawię browara :D [browar] bo rozwiązałem problem. Za momencik wrzucę tutaj cały kod obu programów - dla potomności ;P

Treść w dll:

library Project12;
uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  DB,
  DBAccess,
  MyAccess,
  StdCtrls,
  MemDS;


{$R *.res}

VAR
  MyConect:TMyConnection;

  Procedure conect;
  Var
    i:integer;
    s:string;
  Begin
   MyConect := TMyConnection.Create(nil);
   MyConect.Server:='tu_adres_bazy';
   MyConect.Username:= 'user';
   MyConect.Password:= 'password';
   MyConect.Database:= 'jakas_baza';

   MyConect.Connected:=true;
  // MyConect.free;
  End;

exports
  conect;

begin

end.

Treść w programie który wywołuje dll:

unit Unit1;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
VAR
uchwyt:THandle;
conect:procedure;stdcall;

begin

    uchwyt:= LoadLibrary('Project12.dll');
    if uchwyt = 0 then
      raise Exception.Create('Nie można załadować biblioteki DLL... -> etap_viewer.dll')
    else
    begin
      try @conect:=GetProcAddress(uchwyt,'conect');
        if @conect <> nil then
          conect;
      except
        on E: Exception do
          ShowMessage('Exception error: ' + E.Message);
      end;
    end;
    FreeLibrary(uchwyt);


end;

end.

Jeżeli to się komuś przyda to ciesze się że mogłem pomóc ;)

Ps. Tobie Gothmog wirtualny browarek [browar]

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