![]() |
Zeigertyp von C nach Delphi
Hi,
Ich habe sowas hier vorliegen:
Code:
das habe ich bisher so übersetzt:
typedef void (__cdecl *PFNFCIFREE)(void *memory);
#define FNFCIFREE(fn) void __cdecl fn(void *memory)
Delphi-Quellcode:
stimmt das?
FNFCIFREE = procedure (memory: Pointer); cdecl;
Und hieß das, dass folgendes
Code:
dann dem entsprechen würde:
typedef void * (__cdecl *PFNFCIALLOC)(ULONG cb);
#define FNFCIALLOC(fn) void * __cdecl fn(ULONG cb)
Delphi-Quellcode:
?
FNFCIALLOC = function (cb: ULONG): Pointer; cdecl;
Gruß Neutral General |
Re: Zeigertyp von C nach Delphi
Ich sehe da keinen Fehler.
|
Re: Zeigertyp von C nach Delphi
Ok danke mehr wollte ich nicht wissen :)
|
Re: Zeigertyp von C nach Delphi
Nenn mich pingelig, aber es stimmt nicht ganz.
PFNFCIFREE und PFNFCIALLOC sind die Typendeklarationen, wenn du also ein "P" vor den Namen setzt, ist es formal wieder richtig. Das Makro erstellt offenbar die echte Funktionsdeklaration und Prototypen der Implementation. Folglich entspräche folgender Code in Delphi:
Code:
#define FNFCIFREE(fn) void __cdecl fn(void *memory)
FNFCIFREE(FunktionsName) { // Mach was }
Delphi-Quellcode:
... dieses Makro ist aber vermutlich für den Anwender der DLL irrelevant, es sei denn es handelt sich um Callbacks. In letzterem Fall mußt du es aber ohnehin händisch machen, weil Delphi ja keinen C-Präprozessor hat :mrgreen:
function FunktionsName(cb: ULONG): Pointer; cdecl;
begin // Mach was end; |
Re: Zeigertyp von C nach Delphi
Ich weiß jetzt nicht genau was Callbacks sind aber ich glaube es sind welche. Es sind Procedurentypen die an eine andere Procedure der DLL übergeben werden müssen.
Delphi-Quellcode:
procedure Bla(params: ka); begin end; var cifree: PFNFCIFREE; begin new(cifree); cifree^ := Bla; DLLProcedure(bla); end; // so ungefähr^^ |
Re: Zeigertyp von C nach Delphi
Jupp, sieht stark nach Callbacks aus.
Da gibt es aber nicht wirklich einen Unteerschied. Wenn du die Adresse der Funktion
Delphi-Quellcode:
... übergeben willst, machste das einfach mit "@MeineAllocFunktion" - die Prototypen müssen halt nur mit dem deklarierten Typ übereinstimmen. Also alles im grünen Bereich, vermute ich mal :zwinker:
function MeineAllocFunktion(cb: ULONG): Pointer; cdecl;
begin // Mach was end; Nur warum nicht direkt
Delphi-Quellcode:
oder
var cifree: PFNFCIFREE;
begin cifree := @MeineAllocFunktion; DLLProcedure(cifree); end; // so ungefähr^^
Delphi-Quellcode:
???
begin
DLLProcedure(@MeineAllocFunktion); end; // so ungefähr^^ |
Re: Zeigertyp von C nach Delphi
Zitat:
|
Re: Zeigertyp von C nach Delphi
Zitat:
Übrigens ist das in C noch einfacher, da gibt der Name der Funktion die Adresse zurück und sobald Parameter (oder eben keine) in runden Klammern übergeben werden, handelt es sich um einen Funktionsaufruf. So unterscheidet das eben die Sprache C, obwohl ich den Ansatz in Delphi sympathischer finde (weil expliziter). Aber man kann nicht alles haben :zwinker: |
Re: Zeigertyp von C nach Delphi
Code:
Das erste ist eine Typdeklaration fuer einen Funktionstyp.
typedef void * (__cdecl *PFNFCIALLOC)(ULONG cb);
#define FNFCIALLOC(fn) void * __cdecl fn(ULONG cb)
Delphi-Quellcode:
FNFCIALLOC hingegen ist ein Makro mit dem man passende Funktionen deklariert oder definiert.
type
PFNFCIALLOC = function(cb: ULONG): Pointer; cdecl;
Code:
Das resultiert nach Bearbeitung durch den Preprocessor in:
// Prototyp deklarieren
FNFCIALLOC(testfunktion); FNFCIALLOC(testfunktion) { return NULL; }
Code:
// Prototyp deklarieren
void * __cdecl testfunktion(ULONG cb); void * __cdecl testfunktion(ULONG cb) { return NULL; } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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