AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Daten von C nach PAS und PAS nach C ...
Thema durchsuchen
Ansicht
Themen-Optionen

Daten von C nach PAS und PAS nach C ...

Ein Thema von paule32.jk · begonnen am 30. Jul 2024 · letzter Beitrag vom 31. Jul 2024
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.735 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Daten von C nach PAS und PAS nach C ...

  Alt 30. Jul 2024, 17:38
Ich habe (unter anderem) darüber auf den letzten Forentagen einen Vortrag gehalten. Auf der Seite gibt es auch Sourcecode-Auszüge.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
371 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Daten von C nach PAS und PAS nach C ...

  Alt 30. Jul 2024, 18:48
ah mich deuchtet was ...
der Thomas hat im Quellcode GetProcAddr Pointer verwendet.

jetzt fällt mir gerade ein, das ja der Constructor - egal welche Sprache, ja eine Objekt-Referenz zurückliefert, die dann durchgereicht werden kann...
nicht schlecht sprach Herr Specht.
Danke
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Daten von C nach PAS und PAS nach C ...

  Alt 30. Jul 2024, 19:01
Nein, egal ob zu C++ oder sonstwas ... Klassen-Instanzen zu übergeben macht man einfach nicht.

Bei Packages wird die TypeInfo/Klassendeklaration und die Prozeduren gemeinsam genutzt.
Bei DLL besitzt JEDER seine eigene Kopie und die kann sich beim Kompilieren minimal/extremst unterscheiden, selbst wenn auf beiden Seiten das gleiche Delphi zum Einsatz kam.

Nicht nur die getrennten TypeInfo/RTTI ... ohne ein Shared-Memory geht sowieso nix.

Selbst mit viel einfacheren Strukturen gab es hier ganz böse Probleme.
https://www.delphipraxis.net/213736-...-fuer-neu.html
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Jul 2024 um 19:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
371 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Daten von C nach PAS und PAS nach C ...

  Alt 30. Jul 2024, 19:05
und wenn man nur die Funktionnamen zu einer importierten Funktion weiterleitet,
und dann intern die Pointer handhabt ... ?

hmmm, doppelt nachgedacht, macht das Sinn...
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
237 Beiträge
 
#5

AW: Daten von C nach PAS und PAS nach C ...

  Alt 31. Jul 2024, 09:05
Keine Chance, echt Objekte (außer jetzt die serialisierte Form, wie bei Json) rüber zu reichen ist nicht zu empfehlen.
Ja, es kann sein, dass es klappt, aber liegt beim Kunden die alte DLL, die Exe wurde aber mit einem anderen Compilerflag
compiliert und er nutzt die neue EXE bekommt er lustig Fehlermeldungen und Speicherfehler, die keiner vernünftig
lokalisieren kann.
Lass dich nicht zu verleiten, das so zu tun, nur weil es bei dir beim ersten Test klappt
(oder weil du heute sagst "DLL und EXE werden immer zusammen ausgeliefert").
Das wird dich in falscher Sicherheit wiegen!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Daten von C nach PAS und PAS nach C ...

  Alt 31. Jul 2024, 10:39
Wenn, dann maximal als Pointer und im C wirklich nichts damit machen, außer durchreichen (auf delphiseite ein Cast ... Cast, nicht Pointer auf Variable)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.735 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Daten von C nach PAS und PAS nach C ...

  Alt 31. Jul 2024, 10:49
ah mich deuchtet was ...
der Thomas hat im Quellcode GetProcAddr Pointer verwendet.

jetzt fällt mir gerade ein, das ja der Constructor - egal welche Sprache, ja eine Objekt-Referenz zurückliefert, die dann durchgereicht werden kann...
nicht schlecht sprach Herr Specht.
Danke
Ich reiche keine Pointer auf Instanzen durch sondern nur ein Handle, welches einem Index in ein Array von Instanzen entspricht. Schau Dir den im Vortrag genannten Link auf ein Beispiel bei Embarcadero an, da steht, wie das funktioniert.

Wichtig: Eine C++-Instanz wird automatisch freigegeben, wenn es keine Referenz mehr darauf gibt. Deshalb muss man diese Istanz im Array speichern, bevor die Funktion in der DLL, die die Instanz erzeugt hat, verlassen wird. (Zumindest habe ich das gerade so in Erinnerung, es ist schon wieder eine ganze Weile her, dass ich mich mit dem Kram beschäftigt habe.)
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Daten von C nach PAS und PAS nach C ...

  Alt 31. Jul 2024, 11:26
OK, Objekt vom C++, welches im Delphi durchgereicht wird.

Ober Objekt von Delphi, welches im C++ durchgereicht wird.
Joar, falls dort ARC aktiv wäre, dann hätte man ebenfalls diesen Spaß mit der Referenzzählung.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
371 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Daten von C nach PAS und PAS nach C ...

  Alt 31. Jul 2024, 11:33
Hallo Thomas,
ja, das stimmt.
Speicher(variablen) wird solange gehalten bis sie nicht mehr genutzt werden.
Es gibt zwei Arten, wie Variablen gehalten werden:

Heap => innerhalb einer Prozedur/Funktion gültig (lokaler Scope), und:
Stack => überlebt, wenn die Prozedur/Funktion verlassen wird.

Das mit den Array war ja auch so in meine Richtung...
Eine in C++ verwendete std::map< std::string, void* > Insntanzen;

Dann braucht man nur noch in etwa sowas machen: instanzen["foo"] = 0xcafebabe;
und die map im globalen Scope belassen, dann überleben die Pointer.

Aber ich habe gerade ein anderes Problem:

hier verwende ich einen Delphi-PChar:
Delphi-Quellcode:
{$APPTYPE CONSOLE}
program Project1;

uses Windows;

type
  TMyFunction = procedure(s: PChar); cdecl;

var
  DLLHandle: HMODULE;
  MyFunction: TMyFunction;

begin
  DLLHandle := LoadLibrary('foo.dll');
  if DLLHandle = 0 then
  begin
    MessageBox(0,'Error: DLL could not be loaded.','Error',0);
    ExitProcess(1);
  end;
  try
    @MyFunction := GetProcAddress(DLLHandle, 'TestFunction');
    if @MyFunction = nil then
    begin
      MessageBox(0, 'Error: TestFunction not found in DLL.', 'Error', 0);
      ExitProcess(1);
    end;
    MyFunction(PChar('jukel'));
  finally
      FreeLibrary(DLLHandle);
      ExitProcess(0);
  end;
end.
und hier nur einen 0-terminierten C char *:

Code:
#include <windows.h>
#include <iostream>

#ifdef _WIN64
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif

extern "C" {
DLL_EXPORT void TestFunction(char* func) {
    std::cout << "Func: " << func << std::endl;
}
};
beide Image-Dateien sind im 64-Modus kompiliert.
Aber ich erhalte als Ergebnis (auf der Konsole):

Func: j
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
752 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Daten von C nach PAS und PAS nach C ...

  Alt 31. Jul 2024, 13:29
Was ist denn char in C++ und PChar in Delphi für ein Typ? Haben die die gleiche Anzahl von Bytes je Zeichen?
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:51 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