Предоставление указателя на функцию для обратного вызова C в Delphi - PullRequest
1 голос
/ 04 декабря 2010

Я пытаюсь преобразовать следующие заголовки C в эквивалентные версии Delphi:

/** pointer to a malloc function, supporting client overriding memory
 *  allocation routines */
typedef void * (*yajl_malloc_func)(void *ctx, unsigned int sz);

/** pointer to a free function, supporting client overriding memory
 *  allocation routines */
typedef void (*yajl_free_func)(void *ctx, void * ptr);

/** pointer to a realloc function which can resize an allocation. */
typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, unsigned int sz);

typedef struct
    {
        /** pointer to a function that can allocate uninitialized memory */
        yajl_malloc_func malloc;
        /** pointer to a function that can resize memory allocations */
        yajl_realloc_func realloc;
        /** pointer to a function that can free memory allocated using
         *  reallocFunction or mallocFunction */
        yajl_free_func free;
        /** a context pointer that will be passed to above allocation routines */
        void * ctx;
    } yajl_alloc_funcs;

Мой код Delphi на данный момент выглядит следующим образом:

  Tyajl_malloc_func = function(context: pointer; sizeOf: Cardinal): Pointer of Object; cdecl;

  Tyajl_free_func = procedure(context: pointer; ptr: Pointer) of Object; cdecl;

  Tyajl_realloc_func = function(context: pointer; ptr: Pointer; sizeOf: cardinal): Pointer of Object; cdecl;
  yajl_alloc_funcs = record
    malloc: Tyajl_malloc_func;
    free: Tyajl_free_func;
    realloc: Tyajl_realloc_func;
    ctx: pointer;
  end;

Проблема в том, чтоЯ почти уверен, что отношусь к ним неправильно, так как не могу вспомнить, как получить указатель на две функции.У меня вопрос: как я могу получить указатель на функцию malloc, когда я пытаюсь присвоить ее, например, yajl_alloc_funcs.malloc?

В качестве альтернативы, если я делаю что-то очень неправильное в своем переводе,«правильный» подход здесь?

Обновление: Кажется, есть некоторая путаница по поводу того, что я спрашиваю.Я реализовал реальные методы и пытаюсь передать их в DLL, используя ранее вставленную запись, используя следующий код:

var
   alloc_funcs: yajl_alloc_funcs;
begin
   FillChar(alloc_funcs, SizeOf(alloc_funcs), #0);
   alloc_funcs.malloc := yajl_malloc;
   alloc_funcs.free := yajl_free;
   alloc_funcs.realloc := yajl_realloc;
..

, который выдает ошибку: E2009 Несовместимые типы: 'обычныйуказатель на процедуру и метод '' 1017 * Что я подозреваю, потому что я сделал что-то не так в своем переводе заголовка.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 04 декабря 2010

Не используйте «объекта» - здесь это не имеет значения.


Обновление: Какая строка кода выдает ошибку?Я не могу себе это представить, следующий код компилируется и работает как положено:

type
  Tyajl_malloc_func = function(context: pointer; sizeOf: Cardinal): Pointer; cdecl;
  Tyajl_free_func = procedure(context: pointer; ptr: Pointer); cdecl;
  Tyajl_realloc_func = function(context: pointer; ptr: Pointer; sizeOf: cardinal): Pointer; cdecl;

  Tyajl_alloc_funcs = record
    malloc: Tyajl_malloc_func;
    free: Tyajl_free_func;
    realloc: Tyajl_realloc_func;
    ctx: pointer;
  end;

function yajl_malloc_func(context: pointer; sizeOf: Cardinal): Pointer; cdecl;
begin
  Result:= Pointer($1234);
end;

var
  yajl_alloc_funcs: Tyajl_alloc_funcs;


procedure TForm1.Button1Click(Sender: TObject);
begin
  yajl_alloc_funcs.malloc:= yajl_malloc_func;
  ShowMessage(Format('%p', [yajl_alloc_funcs.malloc(nil, 0)]));
end;
0 голосов
/ 04 декабря 2010

Теперь вам нужно определить функции, называемые malloc free и realloc, которые вы передаете этой C-библиотеке. Вы можете реализовать их в Delphi, вызвав GetMem, FreeMem и ReallocMem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...