Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi C++ DLL (Funktion) nach Delphi (https://www.delphipraxis.net/195815-c-dll-funktion-nach-delphi.html)

AJ_Oldendorf 29. Mär 2018 08:16

AW: C++ DLL (Funktion) nach Delphi
 
Stimmt, das FillChar hatte gefehlt.
Leider liefert mir die Funktion nicht die Länge zurück, nur ob sie erfolgreich ausgeführt werden konnte.
Aber mit dem FillChar geht es jetzt. Danke für die Hilfe.

Der Link von EWeiss ist auch sehr gut!

AJ_Oldendorf 29. Mär 2018 10:54

AW: C++ DLL (Funktion) nach Delphi
 
Ich habe noch ein Fall den ich euch gerne schildern möchte:

Deklaration in C:

Delphi-Quellcode:
typedef unsigned long My_DWORD;
typedef char         My_STRING;

My_DWORD start_func
  (const My_STRING *name1,  // in
   const My_STRING *name2, // in
   ERROR_T     *error ); // out
In der Doku für den Befehl "start_func" steht für den Parameter "Name2" folgendes:
Nullzeiger eintragen.

In einem C Beispiel, welches ich aber nicht debuggen kann, ist der Aufruf so gemacht:
Delphi-Quellcode:
My_STRING *pname2 = NULL;

ErrClass = start_func((My_STRING *)name1, pname2, &ErrStruct);
Ich habe ein fertiges C Programm, welches genau dieses Befehl aufruft, welchen ich nun im Delphi nachprogrammieren möchte.
Das Ergebnis im C Programm ist, dass die Funktion 0 liefert (also kein Fehler). Ich bekomme immer ein Fehler (Result <> 0), also vermute ich ein Fehler bei meiner Parameterübergabe.
Gelöst habe ich es so:

Delphi-Quellcode:
function start_func(Name1: PAnsiChar; Name2: PAnsiChar; aError: PERROR): LongWord;stdcall;external DP_DLL;

Aufruf:
start_func(PAnsiChar(MyNAME1), Nil, @ErrStruct);
Aber egal was ich als zweiten Parameter übergebe (Nil, Leerzeichen etc.) ich bekomme als Result nie eine 0.
Heißt für mich, dass mein Delphi Programm die Funktion anders aufruft wie das C Programm.
Habt ihr noch eine Idee?

Fritzew 29. Mär 2018 10:58

AW: C++ DLL (Funktion) nach Delphi
 
Versuch mal so:
Delphi-Quellcode:
function start_func(const Name1: PAnsiChar; const Name2: PAnsiChar; aError: PERROR): LongWord;stdcall;external DP_DLL;
Sollte eigentlich funktionieren

AJ_Oldendorf 29. Mär 2018 11:36

AW: C++ DLL (Funktion) nach Delphi
 
Das hat geholfen, danke! :thumb:

AJ_Oldendorf 18. Apr 2018 10:12

AW: C++ DLL (Funktion) nach Delphi
 
Hallo,
ich bin mir nicht sicher, ob ich hier nochmal eine Frage zu dem Thema stellen kann oder ob ich ein neuen Thread hätte aufmachen sollen (gebt mir eine Info wenn ich ein neuen Thread aufmachen soll).

Folgendes Konstrukt habe ich in C vorliegen:

Delphi-Quellcode:
#define My_MAX_ADDR      127U
#define My_MAX_NR        (My_MAX_ADDR + 1)

typedef unsigned char      My_BYTE;
typedef unsigned short     My_WORD;
typedef unsigned long      My_DWORD;
typedef long               My_LONG;

typedef struct My_DATA_INT_S
{
  My_BYTE      value1;
  My_BYTE      no_ram_here_dont_touch[0x00FF];
} PPC_BYTE_PACKED My_DATA_INT_T;

typedef struct My_EF_S
{
 My_DATA_INT_T value1[My_MAX_NR];
 My_BYTE       reserved_b_00[0x8000];
 My_DATA_INT_T value2[My_MAX_NR];
 My_BYTE       reserved_b_01[0x8000];

} PPC_BYTE_PACKED My_EF_T;
Dieses Struktur muss ich jetzt nach Delphi umbauen.
Mein Vorschlag (bin mir mit den Hex-Offsets hinter den Variablen aber nicht sicher):

Delphi-Quellcode:
const
  My_MAX_ADDR = 127;
  My_MAX_NR  = (My_MAX_ADDR + 1);

type
  TMy_MASK_DATA_INT = packed record
    value1 : BYTE;
    no_ram_here_dont_touch : BYTE;
  end;
Den packed record für "My_EF_T" bekomme ich leider nicht abgebildet.
Habt ihr eine Idee wie man das umsetzen könnte?

So vielleicht?
Delphi-Quellcode:
type
  TMy_EF = packed record
    value1 : array[0..My_MAX_NR] of TMy_MASK_DATA_INT;
    reserved_b_00 : BYTE;
    value2 : array[0..My_MAX_NR] of TMy_MASK_DATA_INT;
    reserved_b_01 : BYTE;
  end;

himitsu 18. Apr 2018 10:56

AW: C++ DLL (Funktion) nach Delphi
 
CArray[ANZAHL] = DelphiArray[VON..BIS] aka DelphiArray[0..ANZAHL-1]

Und C-Arrays sind nicht standardmäßig gepackt.
Also vermutlich ohne PACKED und mit passendem {$ALIGN}.

https://www.delphipraxis.net/196036-...-auslesen.html

AJ_Oldendorf 18. Apr 2018 11:13

AW: C++ DLL (Funktion) nach Delphi
 
Danke für den Hinweis.
Ist denn die Implementierung von "TMy_EF" sonst korrekt?
Ich bin mir wie gesagt nicht sicher wegen der Hex Angabe hinter den Variablen.
Es gibt auch solche Konstrukte, welche ich nachbilden muss:

Delphi-Quellcode:
typedef struct My_INFO_S
{
 My_BYTE reserved_b_00[0xF0];
 My_BYTE reserved_b_10[0x2FC];

} BYTE_PACKED_ALIGN4 /* PPC_BYTE_PACKED */ My_INFO_T;
Da sieht das Align anders aus im Delphi oder? Aber die Hex-Angabe verstehe ich aktuell noch nicht.

himitsu 18. Apr 2018 11:48

AW: C++ DLL (Funktion) nach Delphi
 
Mathe? 0xF0 = $F0 oder 240 = 0..239

Code:
typedef struct My_INFO_S
{
 My_BYTE reserved_b_00[0xF0];
 My_BYTE reserved_b_10[0x2FC];

} BYTE_PACKED_ALIGN4 /* PPC_BYTE_PACKED */ My_INFO_T;
Hier ist es egal, da ALIGN immer nur das Maximum angibt und da bei dem Ding alles nur Bytes sind, ist es da immer 1 aka PACKED.

AJ_Oldendorf 18. Apr 2018 12:05

AW: C++ DLL (Funktion) nach Delphi
 
Zitat:

Mathe? 0xF0 = $F0 oder 240 = 0..239
Das ist mir schon klar, ich meine wie das im Delphi aussieht?
Ist das ein Array welches so aussehen würde?

Delphi-Quellcode:
reserved_b_00 : array[0..239] of Byte; //0xF0 = 240
reserved_b_10 : array[0..763] of Byte; //0x2FC = 764
Wenn das richtig wäre, dann müsste ja folgende Deklaration im C++

Delphi-Quellcode:
reserved_b_00[0x8000]
im Delphi so aussehen:
Delphi-Quellcode:
reserved_b_00: array[0..32767] of Byte; //0x8000 = 32768
Verdammt großes array oder?

Neutral General 18. Apr 2018 12:18

AW: C++ DLL (Funktion) nach Delphi
 
So ist es aber.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr.
Seite 2 von 4     12 34      

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