Перевод указателя на C-функцию в Delphi / Pascal? - PullRequest
5 голосов
/ 20 января 2011

Я сейчас перевожу некоторые заголовки C в Delphi .Я не могу найти ссылку для преобразования указателя функции из C в Delphi.

typedef _JAlloc JAlloc;  
struct _JAlloc {  
    void *(*alloc) (JAlloc *allocator, size_t size);  
    void (*free) (JAlloc *allocator, void *p);  
    void *(*realloc) (JAlloc *allocator, void *p, size_t size);  
};
  1. Каким будет перевод на Delphi?

  2. Где найти хорошие ресурсы для ручного преобразования заголовков C в Delphi(включая указатель, директивы препроцессора и т. д.)?

Ответы [ 2 ]

8 голосов
/ 20 января 2011

Используйте этот вид кода

type
  PJAlloc = ^TJAlloc;
  TJAllocAlloc = function(allocator: PJAlloc; size: integer): pointer; cdecl;
  TJAllocFree = procedure(allocator: PJAlloc; p: pointer); cdecl;
  TJAllocRealloc = function(allocator: PJAlloc; p: pointer; size: integer); cdecl;
  TJAlloc = record
    alloc: ^TJAllocAlloc;
    free: ^TJAllocFree;
    realloc: ^TJAllocRealloc;
  end;

И измените cdecl на stdcall, в зависимости от соглашения о вызовах вашей библиотеки C.

Альтернативное объявление (возможно, более «паскальское») может быть:

type
  TJAllocAlloc = function(var allocator: TJAlloc; size: integer): pointer; cdecl;
  TJAllocFree = procedure(var allocator: TJAlloc; p: pointer); cdecl;
  TJAllocRealloc = function(var allocator: TJAlloc; p: pointer; size: integer); cdecl;
  TJAlloc = record
    alloc: ^TJAllocAlloc;
    free: ^TJAllocFree;
    realloc: ^TJAllocRealloc;
  end;
1 голос
/ 20 января 2011

Dr. Утилита Bob's HeadConv полезна для преобразования объявлений C в Delphi и является хорошим средством обучения для сравнения исходного кода C с эквивалентным исходным кодом Pascal.

Вы можете найти его здесь

...