在Delphi中为C回调函数提供指针
我正在尝试将以下C标题转换为等效的Delphi版本:在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
/** 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听起来你需要带着一个更精确的问题回来,那就是将函数分配给记录的那一行。我得到一个不兼容的类型、基数和指针错误。将函数分配给记录的行。我得到一个不兼容的类型,基数和指针错误。