dll + komponenty

0

Witam czy mozna w jakis sposob wrzucic do dllki komponenty np. IdTCPClient ?
probowalem w sposob taki:

uses
  SysUtils,
  Classes,
  Windows,
  IdTCPClient;

var
  tcp : TIdTCPClient;

i gdy napisze "tcp." pokazuja mi sie wszystkie opcje ustalam port server connect biblioteka sie kompiluje ale gdy laduje .dll przez program (potocznie matke) od razu wywala blad. I nie wiem jak to juz zrobic. Pomoze ktos ? [???] Z gory dziekuje!

Rozwiazalem ten problem po przed dodanie do dll'ki Formy
czy istnieje mozliwosc bez dodania Form ?

0

Nie wiem jak jest z Indy, bo Indy ssie, polecam użyć Synapse. Nie mam niestety doświadczenia w samodzielnym używaniu
protokołu TCP w zestawie tych modułów. Jednak zrobiłem test z komponentem THttpSend w bibliotece i wszystko działą ok.
Robisz tak (dla modułu httpsend). Pobierasz Synapse i do katalogu z projektem wrzucasz następujące pliki *.pas z kodem:

blcksock.pas
httpsend.pas
sswin32.pas
synacode.pas
synafpc.pas
synaip.pas
synautil.pas
synsock.pas

Następnie kod mojej dllki o nazwie synatest.dll wygląda następująco:

library synatest;

uses
  httpsend;

procedure DownloadToFile(const URL : PChar; const FileName : PChar);
const
  Location_Prefix = 'Location:' + #32;
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
var
  SynHttp : THttpSend;
  I, Position : integer;
  Str, DirectLink : PChar;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Url);
    DirectLink := '';
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := PChar(SynHttp.Headers[I]);
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := PChar(Copy(Str, Position + Length(Location_Prefix), MaxInt));
              Break;
            end;
          end;
          DownloadToFile(DirectLink, FileName);
        end;
    else
      SynHttp.Document.SaveToFile(FileName);
    end;
  finally
    SynHttp.Free;
  end;
end;

exports
  DownloadToFile;

begin
end.

Czyli standard. Trzeba pamiętać aby nie używać typów string tylko PChar. Następnie moja aplikacja konsolowa wygląda tak:

program main_app;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  H : THandle;
  DownloadToFile : procedure(const URL : PChar; const FileName : PChar);

begin
  H := LoadLibrary('synatest.dll');
  if H <> 0 then
  begin
    DownloadToFile := GetProcAddress(H, 'DownloadToFile');
    if @DownloadToFile <> nil then
    begin
      DownloadToFile('http://www.google.com/index.html', 'D:\test.html');
    end;
  end;
end.

I wszystko działa ok. Nie wiem jak będzie z Indy, bo to dziwny pakiet i sprawiający problemy, ale powinno też zadziałać.
Jeżeli jednak nie zadziała dalej to potwierdza "doskonałośc" Indy i sugeruje aby zainteresować się Synapse. Pod adresem
http://www.ararat.cz/synapse/doku.php/download jest do pobrania cały pakiet z dokumentacją i przykładami. I są w nim
również komponenty pozwalające napisać klient - server TCP. Jednak jak już wspomniałem nie mam doświadczenia z nimi.

0

Olesio wlasnie nigdy nie kozystalem z Synapse ale nie raz slyszalem ze jest o wiele lepsze od Indy. Dlatego tez w krotce pewnie zainteresuje sie Synapse i bedzie przesiadka chodz nie wiem czy nie ruszyc WinInet i WinSock zamiast dalej bawic sie w komponenty tego typu. No i oczywiscie dzieki za przyklad!.

maciejmt faktycznie bylo brak Create i teraz juz wszystko dziala! Dzieki wielkie. :)

0
olesio napisał(a)

Nie wiem jak jest z Indy, bo Indy ssie, polecam użyć Synapse. Nie mam niestety doświadczenia w samodzielnym używaniu
protokołu TCP w zestawie tych modułów. Jednak zrobiłem test z komponentem THttpSend w bibliotece i wszystko działą ok.
Robisz tak (dla modułu httpsend). Pobierasz Synapse i do katalogu z projektem wrzucasz następujące pliki *.pas (...)
Tylko nie do katalogu projektu bo się bałagan zrobi. Daj do jednego katalogu wspólnego dla wszystkich projektów i wskaż ten katalog w project=>options=>directories=>search path i dodatkowo zaznacz "default" to dla każdego projektu ta ścieżka zostanie wpisana w "search path".

0

Mariusz Jędrzejowski: są różne "szkoły". Można dla siebie wrzucić do Lib, jednak ja mam zwyczaj, że na ogół moduły wszystkich
niestandardowych komponentów, których nie posiada używane przeze mnie Delphi 7 Personal wrzucam do katalogu z projektem.
Dzięki temu osoba która otrzyma ode mnie źródło będzie mogła bez problemów je skompilowac na "gołym" Delphi 7 Personal lub
wyższym. Nawet jak trafi się użyta kontrolka TTrayIcon to przy użyciu dodatku QExpets wykonuje także "Components to Code" i
oczywiście dołączam wymagane przez komponenty pliki modułów. A wyjątek chyba zrobiłem tylko raz dla Indy oraz dla SynEdit.

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