Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中为C回调函数提供指针_C_Delphi_Header_Translation - Fatal编程技术网

在Delphi中为C回调函数提供指针

在Delphi中为C回调函数提供指针,c,delphi,header,translation,C,Delphi,Header,Translation,我正在尝试将以下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

我正在尝试将以下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不兼容类型:“常规过程和方法指针” 我怀疑这是因为我在标题翻译中做错了什么


非常感谢您的帮助。

您现在需要定义一个名为malloc free和realloc的函数,并将其传递给这个C库。您可以通过调用GetMem、FreeMem和ReallocMem在Delphi中实现它们。

您现在需要定义传递到此C库的名为malloc free和realloc的函数。您可以在Delphi中通过调用GetMem、FreeMem和ReallocMem来实现它们。

不要使用“of Object”-这与此无关


更新:哪行代码会给您带来错误?我无法想象,下一段代码会按照预期编译和工作:

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;
不要使用“of Object”-这与此无关


更新:哪行代码会给您带来错误?我无法想象,下一段代码会按照预期编译和工作:

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;


从C到Delphi的转换?你最好重写逻辑…@ring0-我不确定我是否明白你的意思,逻辑问题在哪里?@ring0你还不明白问题是什么?在Delphi中通过其标题使用C函数。。。包括
malloc()
?@ring0否!此C库将从Delphi调用。我猜这是以DLL的形式出现的。OP有C头文件,需要将函数原型从C转换为Delphi。这段代码允许库的客户端提供自己的内存分配例程。从C到Delphi的转换?你最好重写逻辑…@ring0-我不确定我是否明白你的意思,逻辑问题在哪里?@ring0你还不明白问题是什么?在Delphi中通过其标题使用C函数。。。包括
malloc()
?@ring0否!此C库将从Delphi调用。我猜这是以DLL的形式出现的。OP有C头文件,需要将函数原型从C转换为Delphi。这段代码允许库的客户机提供自己的内存分配例程。对于造成的混乱,我深表歉意。问题不在于函数的实现,而在于头的转换。这段代码允许您覆盖C库中的内存分配。如果你想这样做,那么你需要提供malloc,free等。如果你不想这样做,那么你可以忽略这一点。Serg是正确的,对象是错误的,因为这些是自由函数而不是实例方法。谢谢David,我意识到它们的目的,并且已经在其他地方有了实现,但是我在使用翻译的标题时遇到了问题,我认为这就是我的问题所在。@jamiei听起来你需要带着更精确的问题回来,为困惑道歉。问题不在于函数的实现,而在于头的转换。这段代码允许您覆盖C库中的内存分配。如果你想这样做,那么你需要提供malloc,free等。如果你不想这样做,那么你可以忽略这一点。Serg是正确的,对象是错误的,因为这些是自由函数而不是实例方法。谢谢David,我意识到它们的目的,并且在其他地方已经有了实现,但是我在使用翻译的标题时遇到了问题,我认为这就是我的问题所在。@jamiei听起来你需要带着一个更精确的问题回来,那就是将函数分配给记录的那一行。我得到一个不兼容的类型、基数和指针错误。将函数分配给记录的行。我得到一个不兼容的类型,基数和指针错误。