Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi c++ header konvertieren extern const struct (https://www.delphipraxis.net/198156-c-header-konvertieren-extern-const-struct.html)

Rainer Wolff 8. Okt 2018 22:32

Delphi-Version: 10.2 Tokyo

c++ header konvertieren extern const struct
 
Hallo,

ich versuche mich gerade daran, die OPC-Library open62541 in Delphi einzubinden.

In den Sourcen ist so was ähnliches definiert

Code:
typedef struct {
   int a;
   int b;
} Clientconfiguration;

const Clientconfiguration DefaultConfiguration = { 55,56 };
also anscheinend wird eine Struktur deklariert und davon dann eine konstante Instanz erstellt.

Im Header, den ich dann konvertieren und importieren will:
Code:
extern const __declspec(dllimport) Clientconfiguration DefaultConfiguration;
Wie ist so was zu importieren (im realen Leben ist die Clientconfiguration natürlich um einiges komplizierter, enthält weitere structs, Funktionszeiger etc.

samso 9. Okt 2018 16:51

AW: c++ header konvertieren extern const struct
 
Dann eben nicht.

Zacherl 9. Okt 2018 16:54

AW: c++ header konvertieren extern const struct
 
Ich denke eher, dass es darum geht, wie man das Symbol dann in einer Dll exportieren kann. Hier sind ja "normal" nur Funktionen vorgesehen.

Rainer Wolff 9. Okt 2018 17:46

AW: c++ header konvertieren extern const struct
 
ja, Zacherl hat recht:

Die gesamte Konstantenstruktur ist extern in der DLL festgelegt, sie enthält nicht nur einfache Datentypen, sondern auch Funktionszeiger, die wiederum auf Funktionen innerhalb der DLL verweisen

Code:
const UA_ClientConfig UA_ClientConfig_default = {
    5000, /* .timeout, 5 seconds */
    10 * 60 * 1000, /* .secureChannelLifeTime, 10 minutes */
    UA_Log_Stdout, /* .logger */
    { /* .localConnectionConfig */
        0, /* .protocolVersion */
        65535, /* .sendBufferSize, 64k per chunk */
        65535, /* .recvBufferSize, 64k per chunk */
        0, /* .maxMessageSize, 0 -> unlimited */
        0 /* .maxChunkCount, 0 -> unlimited */
    },
    UA_ClientConnectionTCP, /* .connectionFunc (for sync connection) */
    UA_ClientConnectionTCP_init, /* .initConnectionFunc (for async client) */
    UA_ClientConnectionTCP_poll_callback, /* .pollConnectionFunc (for async connection) */
    0,   /* .customDataTypesSize */
    NULL, /* .customDataTypes */

    NULL, /* .stateCallback */
    0,   /* .connectivityCheckInterval */

    NULL, /* .inactivityCallback */
    NULL, /* .clientContext */

#ifdef UA_ENABLE_SUBSCRIPTIONS
    10, /* .outStandingPublishRequests */
    NULL /* .subscriptionInactivityCallback */
#endif
};
Ich habe auch schon versucht, die Struktur auf der Delphiseite zu füllen und die Funktionszeiger mit leeren Dummyfunktionen versorgt, aber da haut es mir halt nur eine Speicherverletzung um die Ohren.

KodeZwerg 9. Okt 2018 18:14

AW: c++ header konvertieren extern const struct
 
Zitat:

Zitat von Rainer Wolff (Beitrag 1415262)
Code:
typedef struct {
   int a;
   int b;
} Clientconfiguration;

const Clientconfiguration DefaultConfiguration = { 55,56 };

Falls gefragt war wie man das nach Delphi bringt, ich würde es so machen:
Delphi-Quellcode:
type
  Clientconfiguration = record
   a, b: Integer;
  end;
const
 DefaultConfiguration: Clientconfiguration = (a: 55; b:56);

samso 9. Okt 2018 18:18

AW: c++ header konvertieren extern const struct
 
Du willst also die Library die normalerweise in einen C-Projekt eingebunden wird, statt dessen als DLL erstellen und diese DLL soll dann in ein Delphi-Projekt eingebunden werden, verstehhe ich das so richtig?

Fritzew 9. Okt 2018 18:25

AW: c++ header konvertieren extern const struct
 
Ich habe so etwas ähnliches,
allerdings ist das Struct dort nicht als const sondern als var deklariert.
Aber vielleicht hilft es Dir weiter.
Du musst es zur Laufzeit zuweisen. Delphi kann keine Variablen direkt importieren

Bei mir sieht das so aus:

Delphi-Quellcode:
type
  pc_graphmode = ^tc_graphmode;
  tc_graphmode = packed record
    open_gl, ogl_mode, ogl_turbo, ogl_newdlist, ogl_des_mode,
      ogl_bg_axo, ogl_bg_persp, ogl_stencil, ogl_light_ambient,
      ogl_light_diffuse: integer;
  end;

var c_graphmode : pc_graphmode = nil;

// So wird es importiert du musst die Dll mit LoadLibrary etc laden dann:
c_graphmode := GetProcaddress(dll, 'graphmode');

Rainer Wolff 9. Okt 2018 18:49

AW: c++ header konvertieren extern const struct
 
Jetzt habe ich schon zweimal versucht, eine Antwort zu posten, und jedesmal hiess es: Jemand anderes hat inzwischen das Thema aktualisiert.
Ihr seid wirklich fix, grosses Lob.

Und vielen Dank, Fritzew, das war ein Treffer
Code:
[2018-10-09 19:41:14.307 (UTC+0200)] info/network      TCP network layer listening on opc.tcp://host:4840/
[2018-10-09 19:41:29.265 (UTC+0200)] info/network      Connection 496 | New connection over TCP from ::1
[2018-10-09 19:41:29.269 (UTC+0200)] info/channel      Creating a new SecureChannel
[2018-10-09 19:41:29.269 (UTC+0200)] warn/securitypolicy       No PKI plugin set. Accepting all certificates
[2018-10-09 19:41:29.270 (UTC+0200)] info/channel      Connection 496 | SecureChannel 1 | Opened SecureChannel
[2018-10-09 19:41:29.272 (UTC+0200)] info/session      Connection 496 | SecureChannel 1 | Session ns=1;g=ec600624-ead3-8b0c-2a42-f46f9dd9cdcc | 
ActivateSession: Session activated
:-D

zeras 9. Okt 2018 18:51

AW: c++ header konvertieren extern const struct
 
Zitat:

Zitat von Rainer Wolff (Beitrag 1415262)
Hallo,

ich versuche mich gerade daran, die OPC-Library open62541 in Delphi einzubinden.

Ich hätte auch Interesse an einer Umsetzung nach Delphi. Würdest du hier wieder informieren, wenn du weiter bist?

Fritzew 9. Okt 2018 18:56

AW: c++ header konvertieren extern const struct
 
Na ja wir Badener müssen ja zusammenhalten..... ;-)

Rainer Wolff 10. Okt 2018 22:13

AW: c++ header konvertieren extern const struct
 
Zitat:

Zitat von Fritzew (Beitrag 1415346)
Na ja wir Badener müssen ja zusammenhalten..... ;-)

Genau: "Das schönste Land in Deutschlands Gau’n,...":-D

Der schöne Günther 27. Sep 2020 09:34

AW: c++ header konvertieren extern const struct
 
Zitat:

Zitat von Fritzew (Beitrag 1415342)
Ich habe so etwas ähnliches,
allerdings ist das Struct dort nicht als const sondern als var deklariert.
Aber vielleicht hilft es Dir weiter.
Du musst es zur Laufzeit zuweisen. Delphi kann keine Variablen direkt importieren

Bei mir sieht das so aus: (...)

Auch von mir noch einmal ein großes Dankeschön, daran bin ich auch verzweifelt. Ich wäre nie auf die Idee gekommen, Variablen mit GetProcAddress(..) zu importieren 🤪


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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