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
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 02:49
Ich möchte bezweifeln das die Struct unter C++ mit 1 Byte alignment definiert wurde.
Was soll also dieses packed Record?

gibt es so etwas wie.. in dem C++ code?
Code:
#pragma pack(push, 1)
denke nicht.
Wenn also die Ausrichtung der struct (record) schon nicht stimmt wie soll das andere dann funktionieren.

gruss

Geändert von EWeiss (29. Mär 2018 um 04:58 Uhr)
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
423 Beiträge
 
Delphi 12 Athens
 
#2

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 07:05
Die Struktur ist so deklariert:

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

typedef struct My_ERROR
{
  My_DWORD          Long1;
  My_DWORD          Long2;
  My_BYTE          Byte1;
  My_BYTE          Byte2;
  My_BYTE          Byte3;
}
 PPC_BYTE_PACKED My_ERROR_T;
Ich glaube daher schon, dass meine packed record Struktur richtig ist, es steht ja auch ein sinnvoller Wert in die beiden Long-Variablen.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
423 Beiträge
 
Delphi 12 Athens
 
#3

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 07:27
Mit der Variante von Fritzew steht schonmal was in dem ErrStr drinne.
Leider sind nicht alle 1024 Zeichen sinnvoll gefüllt, aber ca. 200 steht nur noch "Mist" drin.
Wenn ich jetzt die Umwandlung auf ein String mache, bekomme ich eine Zugriffsverletzung (Exception).
Man müsste jetzt bestimmt die Länge noch herausbekommen, da nicht immer alle 1024 Zeichen gefüllt sind.
  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
 
#4

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 08:08
Man müsste jetzt bestimmt die Länge noch herausbekommen, da nicht immer alle 1024 Zeichen gefüllt sind.
Ich tippe mal auf den Rückgabewert der Funktion. Da steht wahrscheinlich die Länge des zurückgegebenen Strings drin.
Alternativ kannst du auch den Text vor der Übergabe an die Funktion mit FillChar nullen. Das wird wahrscheinlich auch funktionieren.
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
Fritzew

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

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 08:10
Mit der Variante von Fritzew steht schonmal was in dem ErrStr drinne.
Leider sind nicht alle 1024 Zeichen sinnvoll gefüllt, aber ca. 200 steht nur noch "Mist" drin.
Wenn ich jetzt die Umwandlung auf ein String mache, bekomme ich eine Zugriffsverletzung (Exception).
Man müsste jetzt bestimmt die Länge noch herausbekommen, da nicht immer alle 1024 Zeichen gefüllt sind.
Dann füge doch bitte vor dem Aufruf einfach ein
 fillchar(ErrStr, Sizeof(ErrStr), 0); ein.

Der Einwurf von EWeis ist schon richtig. aber ohne header file ist es schwer zu sagen.

(Trotz roter Box abgeschickt)
Fritz Westermann
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
423 Beiträge
 
Delphi 12 Athens
 
#6

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
423 Beiträge
 
Delphi 12 Athens
 
#7

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
 
#8

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
423 Beiträge
 
Delphi 12 Athens
 
#9

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 11:36
Das hat geholfen, danke!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 07:37
Die Struktur ist so deklariert:

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

typedef struct My_ERROR
{
  My_DWORD          Long1;
  My_DWORD          Long2;
  My_BYTE          Byte1;
  My_BYTE          Byte2;
  My_BYTE          Byte3;
}
 PPC_BYTE_PACKED My_ERROR_T;
Ich glaube daher schon, dass meine packed record Struktur richtig ist, es steht ja auch ein sinnvoller Wert in die beiden Long-Variablen.
Nun das war aber vorher aus deinem Code nicht ersichtlich von daher fand ich es legitim dich darauf hinzuweisen.
Aber gut bin raus
Aber noch ein link.

gruss

Geändert von EWeiss (29. Mär 2018 um 07:53 Uhr)
  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 16:33 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