Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism DLL mit arry Übergabe (https://www.delphipraxis.net/60586-dll-mit-arry-uebergabe.html)

ueding 9. Jan 2006 17:25


DLL mit arry Übergabe
 
Hallo
ich versuche mich gerade mit DLL Erstellung, komme aber nicht so Richtig weiter. Ich möchte ein Array in der DLL befüllen lassen und dann in meiner Anwendung weiter verarbeiten.
Die DLL soll eine .Net DLL werden, ich möchte die DLL Funktionen von einem Win32 Programm und einer .Net Anwendung aufrufen können. Ich habe da so meine Probleme mit dem setzten von Pointern, es wäre Nett wenn Ihr mir ein bisschen helfen könntet.

So stelle ich mit die DLL vor

DLL Programm
Delphi-Quellcode:
library dll_projekt1;

uses
  SysUtils,
  Classes;


type
    PTRec = ^TREc;
    TRec = record
    name : String;
    vorname : String;
  end;

var
adresse : array [0..99] of TREC;

{$R *.RES}

procedure test(i:integer; var ???? TREC oder adresse );
              // was muss ich hier einsetzen ??


begin
if i > 0 then
  begin
  adresse[0].nachname   := '10';
  adresse[1].vorname := '20';
 end;
end;

exports test;

begin
end.
So stelle ich mit die Hostanwendung vor
Hostanwendung

Delphi-Quellcode:


unit Hostanwendung;
{$unsafecode on}
interface

uses
  System.Drawing, .......;



type
    PTRec = ^TREc;
    TRec = record
    nachname : String;
    vorname : String;
  end;

 adresse = array [1..99] of TREC;

.
.
.
.
implementation


procedure test(i:integer; ??const ff: PTREC ); stdcall; external 'dll_projekt1.dll'; unsafe;
//                 wie muss die Procedure deklariert werden
.
.
.


procedure TWinForm.Button1_Click(sender: ...) unsafe;


begin
// wie muss der Auruf jetzt sein
  test(???? 1,PTREC);

  textbox1.Text := adresse[1].nachname;
  textbox2.Text := adresse[1].vorname;
end;
mit einfachen Variablen hat das schonmal funktioniert aber ich hätte gerne ein Array
danke schonmal für die Nette HILFE

Gregor

heiopei 9. Jan 2006 17:49

Re: DLL mit arry Übergabe
 
hallo,

als erstes musst du im hauptprogramm natürlich die gleiche arraygröße haben...

Delphi-Quellcode:
var
  adresse : array [0..99] of TREC;

...

var
  adresse = array [1..99] of TREC;
dann kannst du nicht einfach im haputprogramm const, statt var schreiben, wenn du var in der dll definiert hast:

Delphi-Quellcode:
...
  procedure test(i:integer; var ???? TREC oder adresse );
..
  procedure test(i:integer; ??const ff: PTREC ); stdcall;
...
und den aufruf machst du so, wie du die prozedur definiert hast:

Delphi-Quellcode:
...
var
  testarr: TREC;
begin
  test(1, ^testarr);
...
end;
außerdem verstehe ich nicht, warum du in der dll-prozedur erst im array 0 was einträgst und dann im array 1 - ist das nur zur demo :?: :oops: :?:


evtl. solltest du noch genauer erklären, was du machen willst, denn du kannst z.b. statt dem übergeben des pointers auch einfach eine funktion mit result definieren..

mfg,
heiopei

ps: was macht der "parameter" unsafe?

Khabarakh 9. Jan 2006 18:31

Re: DLL mit arry Übergabe
 
.NET-Dlls haben einen komplett anderen Aufbau als Win32-Dlls, du kannst von einem Win32-Programm keine Funktionen einer .NET-Dll aufrufen (vice versa geht es per P/Invoke).

ueding 9. Jan 2006 19:25

Re: DLL mit arry Übergabe
 
Danke schonmal für die schnelle Antwort

Zitat:

dann kannst du nicht einfach im haputprogramm const, statt var schreiben, wenn du var in der dll definiert hast:
das weis ich auch das das nicht geht, es wäre nett wenn Ihr den Code passend vervolständigen könnt, wie muss den die Funktion in der DLL aussehen

DLL
Delphi-Quellcode:
..
procedure test(i:integer; var ???? TREC oder adresse );
begin
..
in der Hostanwendung

Delphi-Quellcode:
procedure test(i:integer; ??const ff: PTREC ); stdcall; external 'dll_projekt1.dll'; unsafe;
//                 wie muss die Procedure deklariert werden
.
.
.


procedure TWinForm.Button1_Click(sender: ...) unsafe;


begin
// wie muss der Auruf jetzt sein
  test(???? 1,PTREC);

  textbox1.Text := adresse[1].nachname;
  textbox2.Text := adresse[1].vorname;
Zitat:

evtl. solltest du noch genauer erklären, was du machen willst, denn du kannst z.b. statt dem übergeben des pointers auch einfach eine funktion mit result definieren..
in der DLL wird das Array mit Adressen gefüllt, diese werden dann nach später in der Hostanwendung weiter verarbeitet.

Zitat:

ps: was macht der "parameter" unsafe?
So wird bei .Net in DLL's unsicherer Code gekennzeichnet, z.B. wenn Pointer im spiel sind.

Zitat:

.NET-Dlls haben einen komplett anderen Aufbau als Win32-Dlls, du kannst von einem Win32-Programm keine Funktionen einer .NET-Dll aufrufen (vice versa geht es per P/Invoke).

ich habe schon eine DLL erstellt aus der ich aus einer win32 Anwendung eine .NET DLL aufrufe, und .Net Funktionen ausführe, klappt hervoragend.

Gregor


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