Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi record von exe zu dll (https://www.delphipraxis.net/112511-record-von-exe-zu-dll.html)

hedie 22. Apr 2008 18:14


record von exe zu dll
 
Hallo

Ich möchte einen record aus einer exe einer
DLL Übergeben.

Wie funktioniert dies genau?

Habe es so versucht:

Delphi-Quellcode:
/////////DLL//////////
function hwfunc(PublicVar:record VAR1,VAR2,VAR3:PChar; end):boolean;stdcall;
begin

end;
Doch ich kann zwischen begin und end; also in der code section
der funktion NICHT mit PublicVar.VAR1 auf die variablen zugreifen!!

DeddyH 22. Apr 2008 18:20

Re: record von exe zu dll
 
Ich würde mir eine "Brücken-Unit" bauen, die den Record sowie einen Zeiger darauf definiert und von der Exe und der DLL eingebunden wird. Übergabeparameter ist dann immer der Zeiger.

Die Muhkuh 22. Apr 2008 18:21

Re: record von exe zu dll
 
Gibt ja auch keinen anderen Weg oder?

DeddyH 22. Apr 2008 18:21

Re: record von exe zu dll
 
Ich wüsste auf die Schnelle keinen "sauberen".

hedie 22. Apr 2008 18:27

Re: record von exe zu dll
 
Also kann man nicht ohne weiteres records austauschen????

Das mit der brücken unit hört sich nicht schlecht an.

Kann ich auch einen fixen zeiger definieren?

Weil das prob. ist das die DLL Sprach unabhängig schreibbar sein soll.

Also das man auch eine in C++ Entwickeln kann.

In C++ gibts doch records oder??

Die Muhkuh 22. Apr 2008 18:28

Re: record von exe zu dll
 
Ja gibt es.

Falls Du noch nicht mit DLLs gearbeitet hast, ist hier ein kleines Tutorial für Dich.

shmia 22. Apr 2008 18:30

Re: record von exe zu dll
 
Bei Records muss man natürlich immer einen eigenen Datentyp deklarieren:
Delphi-Quellcode:
type
  TMeinRecord= record // Deklaration
    VAR1,VAR2,VAR3:PChar;
  end
function hwfunc(PublicVar:TMeinRecord):boolean;stdcall;
Diese Deklaration kann man in eine eigene Unit auslagern und damit sowohl in der Applikation als auch der DLL mit Uses einbinden.

hedie 22. Apr 2008 18:48

Re: record von exe zu dll
 
Ok ich hab das nun so gemacht

DLL Laden:

Delphi-Quellcode:
Function Load_DLL (dllfilename,fstring:string;start:boolean):boolean;
   begin
     dllhandle := LoadLibrary(pchar(dllfilename));
    if (dllhandle <> 0) and start = true then begin
       initfunc := GetProcAddress(dllhandle,pchar('initialize'));
       writeln(string(initfunc.InitLine)); ////////NACH DEM LADEN SOLLTE DER TEXT VON InitLine erscheinen
    end;
Function deklariert:

Delphi-Quellcode:
type
  NewInput = record
    Description,Tag,func_name,InitLine:PChar
  end;
...

var
initfunc:function :NewInput;stdcall;
/////DLL////////

Variablen:

Delphi-Quellcode:
type
  NewOutput = record
    Description,Tag,func_name,InitLine:PChar
  end;
Function

Delphi-Quellcode:
function initialize:NewOutput;stdcall;
begin
Result.InitLine := (#13#10) + ('           This Module is a test Module       '); //Zeilen Umbruch und Init Text
Result.Description := pchar('Hello world module'); //Modul Beschreibung
Result.Tag:= pchar('blabla'); // Tag
Result.func_name := pchar('hwfunc'); // Funktions name innerhalb der DLL
end;
Nach dem Laden erscheind der Text this module.... auch mit zeilenumbruch
jedoch gefolgt von einem Fehler

Code:
Zugriffsverletzung bei Adresse 0040514C in modul serv.exe Lesen von Adresse 0009FFFB

DeddyH 22. Apr 2008 19:27

Re: record von exe zu dll
 
Hier mal ein Beispiel:

die Brückenunit
Delphi-Quellcode:
unit UnitBridge;

interface

uses Controls;

type
  PMyRec = ^TMyRec;
  TMyRec = record
    Username: string[40];
    Birthday: TDate;
  end;

implementation

end.
Die DLL:
Delphi-Quellcode:
library DLLTest;

uses
  Windows,Messages,UnitBridge;

procedure ShowParams(Rec: PMyRec); stdcall;
var temp: string;
begin
  temp := Rec^.Username;
  MessageBox(0,PChar(temp),'Info',MB_OK or MB_ICONINFORMATION);
  Rec^.Username := 'Die Muhkuh'; //*gg*
end;

exports ShowParams;

begin
end.
Das aufrufende Formular:
Delphi-Quellcode:
procedure ShowParams(Rec: PMyRec);stdcall; external 'DLLTest.dll';

procedure TFormTest.Button1Click(Sender: TObject);
var Rec: PMyRec;
begin
  New(Rec);
  FillChar(Rec^,SizeOf(Rec^),0);
  Rec^.Username := 'DeddyH';
  Rec^.Birthday := StrToDate('29.04.1966');
  ShowParams(Rec);
  ShowMessage('Und nun: ' + Rec^.Username);
  Dispose(Rec);
end;

Die Muhkuh 22. Apr 2008 19:30

Re: record von exe zu dll
 
Man benutzt mich für Schweinereien :shock:

Könnte man den Speicher nicht auch in der DLL reservieren und im Programm freigeben? Ok, ist keine schöne Lösung, ginge mir nur gerade um das Prinzip.

DeddyH 22. Apr 2008 19:32

Re: record von exe zu dll
 
Ich hab Dich nur ein bisschen älter gemacht :mrgreen: . Und ob ein Modul Speicher freigeben kann, den es gar nicht selbst reserviert hat, möchte ich nicht ausprobieren. Wenn es geht, ist es auf jeden Fall unsauber.

Die Muhkuh 22. Apr 2008 19:33

Re: record von exe zu dll
 
Es dürfte nicht gehen, zumindest hat's mir eine AV an den Kopf geworfen. :mrgreen:

DeddyH 22. Apr 2008 19:34

Re: record von exe zu dll
 
Das ist auch gut so, wo kämen wir hin, wenn jedes Programm den Speicher eines anderen mal so eben freigeben könnte?

Die Muhkuh 22. Apr 2008 19:36

Re: record von exe zu dll
 
Och, wäre doch lustig, dann könnte man den Boden unter den Füßen wegziehen. :tongue:

hedie 22. Apr 2008 20:19

Re: record von exe zu dll
 
Danke für dien Beispiel

Aber ich dachte mit Brücken Unit gets nicht Sprachunabhängig... ?

Die Muhkuh 22. Apr 2008 21:28

Re: record von exe zu dll
 
Es geht ja nicht um die Unit, sondern um den Record, der da drin ist, Du kannst diesen ja auch einmal in der exe definieren und einmal in der DLL, aber da machst Dir halt doppelte Arbeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 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