![]() |
"C" Strukturen in Delphi verwenden
Hallo zusammen,
ich schreibe z.Z ein Delphi Programm das zum Teil auf den C-Code von jemand anderen über eine DLL zugreift. Innerhalb des C-Codes werden Strukturen definiert, das sieht dann beispielsweise so aus:
Delphi-Quellcode:
Auf diese Strukturen möchte ich nun über Funktionen, die einen Pointer
typedef struct TTest
{ char name double zahl double zahl2 }TTest; auf diese Strukturen übergeben, zugreifen. Nun stehe ich irgendwie auf dem Schlauch wie ich Delphi klarmache, dass sich hinter dem übergebenen Pointer ein C-struct (was ja nichts anderes als ein Record ist) verbirgt. An welcher mache ich Delphi bekannt, dass ein Struct im Speicher liegt? Vielleicht kann mir jemand mit einem Beispiel helfen Gruß Sebastian |
Re: "C" Strukturen in Delphi verwenden
Entweder definierst Du typisierte Pointer oder machst einen expliziten Cast.
Typisierte Pointer:
Delphi-Quellcode:
Cast:
type PTest = ^TTest;
TTest = record ... end;
Delphi-Quellcode:
ShowMessage(FloatToStr(TTest(Pointervar^).zahl));
|
Re: "C" Strukturen in Delphi verwenden
Delphi-Quellcode:
Wenn ich das so mache ist PTest ein Zeiger auf Record TTest,
type PTest = ^TTest;
TTest = record name[0..99] of char; ... end; woher ist dem Compiler dann bekannt, dass auf die Daten im struct zugegriffen wird. Ich kann da noch nicht ganz folgen. |
Re: "C" Strukturen in Delphi verwenden
Ok..wenn ich dich richtig verstehe bekommst du einen untypisierten Zeiger von der DLL-Funktion zurück. Der Funktionskopf sieht also ungefähr so aus:
Delphi-Quellcode:
Wenn du einfach das Funktions-Ergebnis einer Variable vom Typ PTest zuweise, weis Delphi wie der Speicher aufgebaut ist und du kannst mithilfe der Dereferenzierung einfach auf die Elemente zugreifen.
function MeineDLL_C_Funktion(meinParameter:integer):Pointer;
P.S. ![]() |
Re: "C" Strukturen in Delphi verwenden
Delphi-Quellcode:
Records sind blöde Speicherschnipsel
type
TTest=record name:Char; zahl:Double; zahl2:Double; end; PTest=Test^; Evtl. musst du bei dem Record Packet verwenden. du kannst genauso gut
Delphi-Quellcode:
machen
type
Test=array[0..sizeof(TTest)] of Byte; einfach den Pointer dereferenzieren und in irgend einen Typ array oder record der Passenden Größe casten bzw. den untytpisierten Pointer in einen Typisierten Pointer der passenden Größe casten. |
Re: "C" Strukturen in Delphi verwenden
Zitat:
|
Re: "C" Strukturen in Delphi verwenden
Hallo,
bei dem Char wäre is noch wichtig, ob er nicht char* meint, weil ein Zeichen für den Namen ist ein bissel mickrig. Das wäre dann in Delphi ein PChar. Heiko |
Re: "C" Strukturen in Delphi verwenden
Ich mache nochmal ein konkretes Beispiel
weil ich glaube das es sich doch um typisierte Zeiger handelt. Ich werfe diese Begrife immer noch durcheinander.
Delphi-Quellcode:
Was hier nach meinem Verständnis gemacht wird ist ein
//C-Code
typedef struct TTest { char name[100]; int zahl1; }TTest; typedef struct Namen { TInfo *namen; // wird wird ein dynamisches Array angelegt } Zeiger auf TInfo. Dieser Zeiger kann man (In C) mit einem Index versehen. Es gibt also eine Menge von TTest structs. Auf diese structs möchte ich nun in Delphi zugreifen... |
Re: "C" Strukturen in Delphi verwenden
Hallo,
zuerst mal fehlt dir in der struct Namen noch ein int iCount sonst weisst du nicht, wie viele im Array sind. Zum Zugriff würde ich einen Hilfspointer benutzten.
Delphi-Quellcode:
Falls Delphi bei den Zeigern meckert, nimm statt Pointer PChar.
type
TTInfo: packed record name: array[0..100] of Char; zah1: Integer; end; PInfo = ^TInfo; var P: Pointer; MyPInfo: PInfo; begin // 1. Element P:= PInfo(Namen.namen); // Zugriff PInfo:= P; PInfo^.zahl // Zugriff // 2. Element P:= PInfo(Namen.namen+SizeOf(TInfo)); // noch + 1 , enfach mal probieren PInfo:= P; PInfo^.zahl // Zugriff Heiko |
Re: "C" Strukturen in Delphi verwenden
Zitat:
mit #0 versehen ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 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