Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr.
Seite 1 von 2  1 2      

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