![]() |
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! |
AW: C++ DLL (Funktion) nach Delphi
Ich habe noch ein Fall den ich euch gerne schildern möchte:
Deklaration in C:
Delphi-Quellcode:
In der Doku für den Befehl "start_func" steht für den Parameter "Name2" folgendes:
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 Nullzeiger eintragen. In einem C Beispiel, welches ich aber nicht debuggen kann, ist der Aufruf so gemacht:
Delphi-Quellcode:
Ich habe ein fertiges C Programm, welches genau dieses Befehl aufruft, welchen ich nun im Delphi nachprogrammieren möchte.
My_STRING *pname2 = NULL;
ErrClass = start_func((My_STRING *)name1, pname2, &ErrStruct); 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:
Aber egal was ich als zweiten Parameter übergebe (Nil, Leerzeichen etc.) ich bekomme als Result nie eine 0.
function start_func(Name1: PAnsiChar; Name2: PAnsiChar; aError: PERROR): LongWord;stdcall;external DP_DLL;
Aufruf: start_func(PAnsiChar(MyNAME1), Nil, @ErrStruct); Heißt für mich, dass mein Delphi Programm die Funktion anders aufruft wie das C Programm. Habt ihr noch eine Idee? |
AW: C++ DLL (Funktion) nach Delphi
Versuch mal so:
Delphi-Quellcode:
Sollte eigentlich funktionieren
function start_func(const Name1: PAnsiChar; const Name2: PAnsiChar; aError: PERROR): LongWord;stdcall;external DP_DLL;
|
AW: C++ DLL (Funktion) nach Delphi
Das hat geholfen, danke! :thumb:
|
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:
Dieses Struktur muss ich jetzt nach Delphi umbauen.
#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; Mein Vorschlag (bin mir mit den Hex-Offsets hinter den Variablen aber nicht sicher):
Delphi-Quellcode:
Den packed record für "My_EF_T" bekomme ich leider nicht abgebildet.
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; 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; |
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}. ![]() |
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:
Da sieht das Align anders aus im Delphi oder? Aber die Hex-Angabe verstehe ich aktuell noch nicht.
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; |
AW: C++ DLL (Funktion) nach Delphi
Mathe? 0xF0 = $F0 oder 240 = 0..239
Code:
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.
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; |
AW: C++ DLL (Funktion) nach Delphi
Zitat:
Ist das ein Array welches so aussehen würde?
Delphi-Quellcode:
Wenn das richtig wäre, dann müsste ja folgende Deklaration im C++
reserved_b_00 : array[0..239] of Byte; //0xF0 = 240
reserved_b_10 : array[0..763] of Byte; //0x2FC = 764
Delphi-Quellcode:
im Delphi so aussehen:
reserved_b_00[0x8000]
Delphi-Quellcode:
Verdammt großes array oder?
reserved_b_00: array[0..32767] of Byte; //0x8000 = 32768
|
AW: C++ DLL (Funktion) nach Delphi
So ist es aber.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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