AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL einbinden, in Klasse oder global

Ein Thema von alf.stefan · begonnen am 11. Nov 2009 · letzter Beitrag vom 11. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#1

DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:11
Hallo zusammen

ich habe eine DLL bekommen und ein beispiel code für delphi der auch gut funktioniert.
In der .pas datei wird die Funktionalität der DLL bereitgestellt.
in etwas so

delphi7!

Delphi-Quellcode:
unit SpsIo;

interface
uses Classes;

const
  spsDll = 'IPS7LNK.DLL';

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


implementation

function IPS7Open; external spsDll name 'IPS7Open';

end.
wie gesagt so funktioniert es wunderbar

wenn ich diese funktionen in eine klasse einbinden will hab ich mir das in etwa so vorgestellt


Delphi-Quellcode:
unit SpsIo;

interface
uses Classes;

const
  spsDll = 'IPS7LNK.DLL';

type TspsIo = class
  Address : string;
  handle : longInt;
  constructor create(Addr : String);
private
  function IPS7Open (IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall;
end;
  

implementation

function TspsIo.IPS7Open; external spsDll name 'IPS7Open';


constructor TSpsIo.create(Addr: String);
begin
     handle := -1;
     handle := IPS7Open(pChar(Addr),0,2,0,0,0);
     Address := Addr;
end;

.end
so gekapselt gibt es bei genau dieser funktion eine Access Violation bei andren funktionen auch mal ein EPrivilege error.

wo ist da der Unterschied beim Aufrufen der Funktion IPS7Open. Meiner Meinug nach habe ich die Funktionen doch nur in der Klasse gekapselt! Oder bin ich da falsch gewickelt?

Wäre schön wenn da mal jemand ein Auge draufwerfen könnte.
Im vorraus schon mal vielen Dank

Gruß
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:23
Schau dir mal den Unterschied von Funktion und Methode an!

Du hast nix gekapselt, und warum willst du es überhaupt so machen? Das bringt doch gar nix. Wo willst du hin?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#3

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:32
hm ich wollte die code Vervollständigung nutzen. also dass ich bei Programm schreiben die klasse+'.' schreibe und das pullup menu mit den ganzen Klassen member aufgeht.

Aber du hast recht mir ist der Unterschied zwischen Methoden und Funktionen nicht so richtig klar!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:38
Dieses Menu bekommst du auch, wenn du die Unit hinschreibst:
SpsIo. //--> jetzt kommt dieses Pulldown-Menu Was du halt amchen kannst, ist den Aufruf in einer Klasse kapseln (also eine Methode nehmen und intern dann die Funktion aufrufen), und die Parameter mittels property setzen. Hilft aber im Programm nur, wenn du den Aufruf mehrmals (an verschiedenen Stellen) benötigst, oder noch andere DLL Aufrufe stattfinden. Oder bei dynamischen einbinden der DLL.
Ganz abwegig ist die Kapselung nicht, aber eben anders machen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#5

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:38
Zitat von alf.stefan:
hm ich wollte die code Vervollständigung nutzen. also dass ich bei Programm schreiben die klasse+'.' schreibe und das pullup menu mit den ganzen Klassen member aufgeht.
Du kannst z.B. 'IP' + Strg-Leertaste drücken, dann musst du den Funktionsnamen auch nicht ausschreiben.

Uli.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:43
Hi,

Du kannst das Kapseln, aber dann nicht so, sondern:

Delphi-Quellcode:
TspsIo = class
public
  constructor create(Addr : String);
  function IPSOpen(IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord): LongInt;
end;

implementation

const
  spsDll = 'IPS7LNK.DLL';

function IPS7Open (IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external spsDll name 'IPS7Open';


function TSPSIO.IPSOpen(IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord): LongInt;
begin
  Result := IPS7Open(IPAdr,Rack,Slot,RxTimeout,TxTimeout,ConnectTimeout);
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:48
Das ganze hat nur ein paar Probleme/Hindernisse.

1. geht es witziger Weise teilweise, daß man Methoden so ex-/importieren kann,
aber beim Erstellen und der Speicherverwaltung der Klasse kann man sich super leicht gravierende Probleme einfangen.
(aber zum Glück willst du hier ja eine Funktion in eine Methode umwandeln und nicht eine Klassen-Methode ex- und importieren)

Du kannst dir ja gern mal von meinem himXML die DLL-Version ansehn.
- diese ist zwar offiziell nicht wirklich freigegeben, da sie einige kleine Macken hat, aber im Download isse mit drinnen.
Alleine an dem Code siehst du schon, daß da so einiges an Drumrum gibt, damit es überhaupt geht.


Abgesehn davon ist eine Methode keine Prozedur/Funktion,
denn deine Methode hat einen "unsichtbaren" Parameter, welcher in der importierten Funktion fehlt.
siehe #10 > http://www.delphipraxis.net/internal...ht=self+object
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:49
TspsIo.IPS7Open

Wenn Du das so machst, ist das ein 8-Byte Pointer, nicht 4 byte, wie erwartet.
Der Grund ist ein einfacher : Delphi braucht 4 Byte für die funktion (die nur einmal im Peicher ist und von allen erstellten Objekten diesen Typs verwendet wird und 4 Byte sind für das "Datensegment" deines Objekts, da der Code ja nicht weiss, wo deine Variablen sind für jede Instanz des Objektes.

Solche 8-Byte pointer kann man afaik nicht exportieren. Dies ist ja auch sehr Delphi spezifisch und DLL sind dazu gedacht, mit allen Programmiersprachen zu funktionieren
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#9

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 15:55
So was ähnliches wie Stefans Versuch geht tatsächlich:
Delphi-Quellcode:
unit WindowsX;

interface

uses
  Windows;

function MessageBoxX(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;

type
  TWindowsX = class
    class function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall; static;
  end;

implementation

function MessageBoxX; external user32 name 'MessageBoxA';
class function TWindowsX.MessageBox; external user32 name 'MessageBoxA';

end.
Aufruf:
Delphi-Quellcode:
begin
  MessageBoxX(0, 'Direkt', 'Direkt', 0);
  TWindowsX.MessageBox(0, 'Per Klasse', 'Per Klasse', 0);
end.
Ist natürlich nicht wirklich OO, aber man könnte die importierten Routinen zumindest gruppieren und privat machen.

Edit: Das static hinterm stdcall ist wichtig - es beseitigt den Self-Pointer aus himitsus Post.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: DLL einbinden, in Klasse oder global

  Alt 11. Nov 2009, 16:00
Ist eine class function nicht sowieso immer statisch?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz