Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:31
Bevor ihr hier solche Verrenkungen macht:
In folgendem Beispiel kann sich so eine Klasse erst lohnen:
Delphi-Quellcode:
unit Unit2;

interface

uses Windows, Sysutils;

type

  IPS7Exception = class(Exception);

  IPS7Open=function(IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall;

  TIPS7 = class
    Constructor Create;
    Destructor Destroy; override;
   private
    FDLL:THandle;
    FIPS7Open:IPS7Open;
    FConnectTimeout: LongWord;
    FRack: LongWord;
    FSlot: LongWord;
    FRxTimeOut: Longword;
    FTxTimeout: LongWord;
    FIPAdr: AnsiString;
    procedure SetConnectTimeout(const Value: LongWord);
    procedure SetIPAdr(const Value: AnsiString);
    procedure SetRack(const Value: LongWord);
    procedure SetRxTimeOut(const Value: Longword);
    procedure SetSlot(const Value: LongWord);
    procedure SetTxTimeout(const Value: LongWord);
   public
    property IPAdr:AnsiString read FIPAdr write SetIPAdr;
    property Rack :LongWord read FRack write SetRack;
    property Slot :LongWord read FSlot write SetSlot;
    property RxTimeOut:Longword read FRxTimeOut write SetRxTimeOut;
    property TxTimeout:LongWord read FTxTimeout write SetTxTimeout;
    property ConnectTimeout:LongWord read FConnectTimeout write SetConnectTimeout;
    function Open:Longword;
  end;




implementation

const
  spsDll = 'IPS7LNK.DLL';


{ TIPS7 }

constructor TIPS7.Create;
begin
  FDLL:=Loadlibrary(spsDLL);
  if FDLL=0 then
    raise IPS7Exception.CreateFmt('Fehler beim Laden der DLL: %s',
      [syserrormessage(getlasterror)]);
  FIPS7Open:=GetProcAddress(FDLL,'IPS7Open');
  if not assigned(FIPS7Open) then
    raise IPS7Exception.CreateFmt('Fehler beim LAden der Funktionsadresse: %s',
      [syserrormessage(getlasterror)]);
end;

destructor TIPS7.Destroy;
begin
  FreeLibrary(FDLL);
  inherited;
end;

function TIPS7.Open: Longword;
begin
  result:=FIPS7Open(PAnsiChar(FIPAdr),FRack,FSlot,FRxTimeout,
    FTxTimeout,FConnectTimeout);
end;

procedure TIPS7.SetConnectTimeout(const Value: LongWord);
begin
  FConnectTimeout := Value;
end;

procedure TIPS7.SetIPAdr(const Value: String);
begin
  FIPAdr := Value;
end;

procedure TIPS7.SetRack(const Value: LongWord);
begin
  FRack := Value;
end;

procedure TIPS7.SetRxTimeOut(const Value: Longword);
begin
  FRxTimeOut := Value;
end;

procedure TIPS7.SetSlot(const Value: LongWord);
begin
  FSlot := Value;
end;

procedure TIPS7.SetTxTimeout(const Value: LongWord);
begin
  FTxTimeout := Value;
end;

end.
Damit hat man auch gleich einen Container für die Parameter und kann hier noch weitere Funktionen kapseln. Bringt natürlich nur etwas, wenn man diesen Container auch benötigt.
Zudem habe ich DLL noch dynamisch eingebunden. Dadurch führt ein Fehlen der DLL nicht gleich zum Nichtstarten des Programms. Bringt auch nur etwas, wenn das Programm auch ohne diese DLL einen Sinn macht.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat