AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeigertyp von C nach Delphi

Ein Thema von Neutral General · begonnen am 16. Aug 2007 · letzter Beitrag vom 17. Aug 2007
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 17:36
Hi,

Ich habe sowas hier vorliegen:

Code:
typedef void (__cdecl *PFNFCIFREE)(void *memory);
#define FNFCIFREE(fn) void __cdecl fn(void *memory)
das habe ich bisher so übersetzt:

FNFCIFREE = procedure (memory: Pointer); cdecl; stimmt das?

Und hieß das, dass folgendes

Code:
typedef void * (__cdecl *PFNFCIALLOC)(ULONG cb);
#define FNFCIALLOC(fn) void * __cdecl fn(ULONG cb)
dann dem entsprechen würde:

FNFCIALLOC = function (cb: ULONG): Pointer; cdecl; ?

Gruß
Neutral General
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
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 18:33
Ich sehe da keinen Fehler.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  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
 
#3

Re: Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 18:36
Ok danke mehr wollte ich nicht wissen
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
Olli
(Gast)

n/a Beiträge
 
#4

Re: Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 19:38
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:
function FunktionsName(cb: ULONG): Pointer; cdecl;
begin
  // Mach was
end;
... 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
  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
 
#5

Re: Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 19:41
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^^
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
Olli
(Gast)

n/a Beiträge
 
#6

Re: Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 19:55
Jupp, sieht stark nach Callbacks aus.

Da gibt es aber nicht wirklich einen Unteerschied. Wenn du die Adresse der Funktion

Delphi-Quellcode:
function MeineAllocFunktion(cb: ULONG): Pointer; cdecl;
begin
  // Mach was
end;
... ü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

Nur warum nicht direkt

Delphi-Quellcode:
var cifree: PFNFCIFREE;
begin
  cifree := @MeineAllocFunktion;
  DLLProcedure(cifree);
end; // so ungefähr^^
oder

Delphi-Quellcode:
begin
  DLLProcedure(@MeineAllocFunktion);
end; // so ungefähr^^
???
  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
 
#7

Re: Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 20:20
Zitat von Olli:
Nur warum nicht direkt

Delphi-Quellcode:
var cifree: PFNFCIFREE;
begin
  cifree := @MeineAllocFunktion;
  DLLProcedure(cifree);
end; // so ungefähr^^
oder

Delphi-Quellcode:
begin
  DLLProcedure(@MeineAllocFunktion);
end; // so ungefähr^^
???
Wieso einfach wenns auch kompliziert geht ?
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
Olli
(Gast)

n/a Beiträge
 
#8

Re: Zeigertyp von C nach Delphi

  Alt 16. Aug 2007, 20:25
Zitat von Neutral General:
Wieso einfach wenns auch kompliziert geht ?


Ü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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Zeigertyp von C nach Delphi

  Alt 17. Aug 2007, 05:46
Code:
typedef void * (__cdecl *PFNFCIALLOC)(ULONG cb);
#define FNFCIALLOC(fn) void * __cdecl fn(ULONG cb)
Das erste ist eine Typdeklaration fuer einen Funktionstyp.
Delphi-Quellcode:
type
  PFNFCIALLOC = function(cb: ULONG): Pointer; cdecl;
FNFCIALLOC hingegen ist ein Makro mit dem man passende Funktionen deklariert oder definiert.
Code:
// Prototyp deklarieren
FNFCIALLOC(testfunktion);

FNFCIALLOC(testfunktion)
 {
  return NULL;
 }
Das resultiert nach Bearbeitung durch den Preprocessor in:
Code:
// Prototyp deklarieren
void * __cdecl testfunktion(ULONG cb);

void * __cdecl testfunktion(ULONG cb)
 {
  return NULL;
 }
  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 04:59 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