AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi C++ DLL (Funktion) nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

C++ DLL (Funktion) nach Delphi

Ein Thema von AJ_Oldendorf · begonnen am 28. Mär 2018 · letzter Beitrag vom 20. Apr 2018
Antwort Antwort
Seite 2 von 4     12 34      
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#11

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 08:16
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!
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 10:54
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?
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 10:58
Versuch mal so:
function start_func(const Name1: PAnsiChar; const Name2: PAnsiChar; aError: PERROR): LongWord;stdcall;external DP_DLL; Sollte eigentlich funktionieren
Fritz Westermann
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 11:36
Das hat geholfen, danke!
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: C++ DLL (Funktion) nach Delphi

  Alt 18. Apr 2018, 10:12
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;

Geändert von AJ_Oldendorf (18. Apr 2018 um 10:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#16

AW: C++ DLL (Funktion) nach Delphi

  Alt 18. Apr 2018, 10:56
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Apr 2018 um 10:59 Uhr)
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: C++ DLL (Funktion) nach Delphi

  Alt 18. Apr 2018, 11:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#18

AW: C++ DLL (Funktion) nach Delphi

  Alt 18. Apr 2018, 11:48
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: C++ DLL (Funktion) nach Delphi

  Alt 18. Apr 2018, 12:05
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++

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

Geändert von AJ_Oldendorf (18. Apr 2018 um 12:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

AW: C++ DLL (Funktion) nach Delphi

  Alt 18. Apr 2018, 12:18
So ist es aber.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 19:23 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