AGB  ·  Datenschutz  ·  Impressum  







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

DLL mit arry Übergabe

Ein Thema von ueding · begonnen am 9. Jan 2006 · letzter Beitrag vom 9. Jan 2006
Antwort Antwort
ueding

Registriert seit: 21. Aug 2005
30 Beiträge
 
Delphi 10.4 Sydney
 
#1

DLL mit arry Übergabe

  Alt 9. Jan 2006, 18:25
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
  Mit Zitat antworten Zitat
heiopei
(Gast)

n/a Beiträge
 
#2

Re: DLL mit arry Übergabe

  Alt 9. Jan 2006, 18:49
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


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?
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: DLL mit arry Übergabe

  Alt 9. Jan 2006, 19:31
.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).
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
ueding

Registriert seit: 21. Aug 2005
30 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: DLL mit arry Übergabe

  Alt 9. Jan 2006, 20:25
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
  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 23:27 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