AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

Offene Frage von "MyRealName"
Ein Thema von Aviator · begonnen am 30. Sep 2016 · letzter Beitrag vom 13. Okt 2016
Antwort Antwort
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#1

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 30. Sep 2016, 16:55

Ich dachte immer, dass FastMM viel mehr Informationen zur Verfügung stellen würde. Wenn ich mich recht entsinne gab es doch eine Inc Datei in der Einstellungen vorgenommen werden konnten. Verzeiht mir die vielleicht blöden Fragen, aber damit habe ich mich nie wirklich beschäftigt.
Dazu muss man dann doch wieder Hand anlegen. "FullDebugMode" ist dazu das Stichwort. Aber das ist ja eigentlich nicht das Thema.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 30. Sep 2016, 17:00
Aber das ist ja eigentlich nicht das Thema.
Naja bedingt ja schon. Zacherl hat ja darauf hingewiesen, dass FastMM da ein Auge drauf hat. Natürlich würde ich dann auch ganz gerne wissen wie ich Fehler (auch im Bezug auf DLL Programmierung) finde wenn denn welche auftreten. Ich will natürlich jetzt nicht für alle möglichen kleinen Fragen eine extra Thread öffnen. Das kommt mir dann immer so unnötig viel / überflüssig vor.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#3

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 30. Sep 2016, 17:04
Vielleicht hilft Dir das ja weiter:

http://www.delphipraxis.net/183846-f...nshutdown.html

und natürlich

Quelltext FastMM

Geändert von samso (30. Sep 2016 um 17:07 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 30. Sep 2016, 20:45
Danke. Werde ich mir mal anschauen.

Trotzdem bleibt für mich immer noch das Problem, dass ich noch nicht den 100%igen Durchblick habe, wie ich denn die DLL jetzt aufbauen muss. Kann da vielleicht mal jemand ein kleines Beispiel machen.

Pseudoabfrage von einem SQL-Server und Übergabe der Daten an mein Programm. Die Funktion wird dann logischerweise aus dem Programm heraus aufgerufen. Wäre sowas machbar?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#5

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 1. Okt 2016, 05:45
Also wir benutzen Interfaces. Das hat den enormen Vorteil, dass die reine DLL Schnittstelle sehr schlank sein kann. Wir haben eine Funktion in der DLL, die von der Anwendung aufgerufen wird nachdem die DLL geladen ist. Diese bekommt das Anwendungsinterface. Darüber meldet sich umgekehrt die DLL an der Anwendung an und übergibt ebenfalls ein Interface.

Darüber können nun Interfaces bei der Anwendung registriert oder angefordert werden.

Es gibt eine Klasse TApplicationInterface, die das ganze kapselt. Und dann geht das ganze direkt generisch. Zum Beispiel funktioniert dann das sowohl in DLL als auch in der Anwendung:
Delphi-Quellcode:
var
  Params: IInterfaceGetterParams;
  Data: IDataset;
begin
  Params := TDatabaseGetterParams.Create(TDatasetKind.Query, 'select * from foo');
  Data := TApplicationInterface.Get<IDataset>(Params);
  while not Data.Eof do
  ...
Interfaces kennen ja nun keine generischen Methodenparameter. Das funktioniert daher, indem die Klassenmethode Get die GUID des generischen Parameters ermittelt und über das Interface an der Hauptanwendung diese GUID und das Parameterinterface übergibt. Dort wird dann über die GUID die registrierte Factorymethode ermittelt, mit der das Interface geholt werden kann, und mit dem Parameterinterface aufgerufen.

Natürlich kann man bei wenigen Interfaces (bei uns sind es eben sehr viele) auch im Interface der Hauptanwendung direkt z.B. eine Methode GetDataset: IDataset usw. anlegen und braucht keine Generics dafür.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 1. Okt 2016, 17:46
Also Interfaces würde ich ja auch benutzen. Das steht außer Frage. Nur stehe ich auf dem Schlauch, was das Abrufen von Ergebnissen vom SQL-Server und das Übergeben der Ergebnisse an die Anwendung angeht. Innerhalb meiner Anwendung würde ich die Ergebnisse gerne in Form eines Objektes zwischenspeichern. Um mal bei den Benutzern zu bleiben als Instanz bzw. mehrere Instanzen eines TUser Objektes.

Wäre es sinnvoll so etwas zu tun? Nur mal als Beispiel und hier im Editor runtergetippt.

Delphi-Quellcode:
IUserExchanger = interface(IInterface)
  procedure AddNewUser(const Username: string; FirstName: string; LastName: string);
  procedure AddUserGroup(const ID: Integer; const Name: string);
  [...]
end;
Die DLL Exportiert dann eine Funktion GetUsers oder wahlweise auch GetInstance die als Parameter eine Instanz eines IUserExchanger Objektes erwartet.
Delphi-Quellcode:
IUserInterface = interface(IInterface)
  procedure GetUsers(UserExchanger: IUserExchanger);
end;
Delphi-Quellcode:
TUserExchanger = class(TInterfacedObject, IUserExchanger)
private
  FUsers: TObjectList<TUser>;
  User: TUser;
public
  procedure AddNewUser(const Username: string; FirstName: string; LastName: string);
  procedure AddUserGroup(const ID: Integer; const Name: string);
end;

implementation

procedure TUserExchanger.AddNewUser(const Username: string; FirstName: string; LastName: string);
begin
  User := TUser.Create;
  User.UserName := UserName;
  User.FirstName := FirstName;
  User.LastName := LastName;
  FUsers.Add(User);
end;

procedure TUserExchanger.AddUserGroup(const ID: Integer; const Name: string);
begin
  User.Groups.Add(ID, Name);
end;
Nur mal so ein Gedanke. Falls da etwas unklar sein sollte, dann versuche ich gerne es etwas besser zu beschreiben.

Macht man so etwas oder gibt es da Nachteile? Laut Zacherl wäre es ja auch mittlerweile kein Problem mehr, Strings direkt auszutauschen. Beide Anwendungen die darauf zugreifen sind in Delphi geschrieben.

Wenn das doch nicht gehen sollte, würde dann so etwas funktionieren? Bitte auf das PChar achten. Das Interface habe ich hierfür nicht extra noch einmal geschrieben.

Delphi-Quellcode:
procedure TUserExchanger.AddUserGroup(const ID: Integer; const Name: PChar);
var
  LName: string;
begin
  LName := Name;
  User.Groups.Add(ID, LName);
end;
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 4. Okt 2016, 10:56
Hat hierzu noch jemand eine Idee? Kann man das so machen bzw. macht man das überhaupt so wie in meinem Beispiel gezeigt?

Wenn nicht, dann wäre es super wenn mir vielleicht jemand ein Beispiel machen könnte wie man so etwas am Elegantesten löst. Ich finde hierzu irgendwie keine passenden Informationen oder kann sie zumindest nicht auf meinen Fall anwenden.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

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

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 13. Okt 2016, 17:35
Ich gebe mal eine Weisheit dazu (als alter DLL Programmierer), die ich für wichtig halte und in Deinem Fall für extrem wichtig, da Du ja von unerschiedlichen Programmen auf dynamisch erzeugte records zugreifen willst :

Speicher wird dort freigegeben, wo er erzeugt wurde.

Ich handle das wie folgt : Einen Standard-Record, der eine FreeMem procedure enthält, und die dann im record andere Daten enthalten kann wie einen Pointer und Pointer-Grösse, was dann an die FreeMem-Routine durch den record mitgegeben wird.

Code:
Type RDllRec = packed record
       P : Pointer;
       Size : Int64;
       FreeMemProc : TFreeMemProc;
     end;
     PDllRec = ^RDllRec;
Der Pointer P im record enthält Deine eigentlichen Daten. Du rufst dann FreeMem auf mit dem record, welcher übergeben wurde, der zerstört Speicher :

Code:
procedure MyFreeMemProc(pData : PDllRec);
begin
  FreeMem(pData^.P, pData^.Size);
  Dispose(pData);
end;
Der FreeMemProc musst natürlich MyFreeMemProc zuweisen, welche dort ist wo der Speicher erzeugt wurde (also in der DLL).
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz