将C ++回调函数转换为Delphi

时间:2019-02-27 15:02:33

标签: c++ function delphi

在将此C ++标头转换为Delphi时,我需要帮助。

这是一个回调函数原型,还有一些内联函数(我不清楚它们为什么会在其中,因为似乎没有使用它们)。

源.h代码:

function updateTable() {
  $.ajax({
    ...
    ,complete: function(data){
       // do something
       setTimeout(updateTable, 10000);
    ...
  });
}

上面的内容很容易:它应该在 Delphi 中进行如下翻译:

// This file defines 'myStreamWriter_t' a function pointer type.
// The user of the C API need to specify a callback of above type which
// will be called on xxx_print(...) with the formatted data.
// For C++ API, a default callback is specified which writes data to
// the stream specified in xxx::print

typedef int(*myStreamWriter_t)(const char* p1,
                                     int p2,
                                     void *p3);


现在,还有其他我不知道如何翻译的东西:

Souce .h代码:

type
   myStreamWriter_t = function(const p1:Pchar; 
                                     p2:integer;
                                     p3:pointer):integer;

...如何在Delphi中翻译以上内容?

非常感谢您!

1 个答案:

答案 0 :(得分:1)

您的翻译不正确。可能应该是:

type
  myStreamWriter_t = function(p1: PAnsiChar; p2: Integer; p3: Pointer): Integer cdecl;

请注意,const char *x(指向const字符的非const指针)没有Delphi等效项,因此只需使用PAnsiChar。在2009年以后的任何Delphi中,PChar都是PWideChar,这并不等于char *

const x: PAnsiChar等同于char * const x,这意味着指针是const,而不是它指向的字符。

很可能您的呼叫约定是错误的。

类似地,您应该翻译其他功能。但是请注意,结构上的函数(方法)可能以不同的方式调用,即使用专有的Microsoft方法约定(__thiscall)。没有等效的Delphi。

但是您可能必须在不引起兼容性麻烦的情况下才能调用此类方法。 您可以模仿这些类/结构的行为,但是您将无法使其在Delphi中与二进制兼容,除非您跳了几圈并且/或者使用了汇编程序

我的网站上的更多信息:

如果您想模仿该行为,则可以执行以下操作:

 OstreamWriter(p1: AnsiChar; p2: Integer; p3: Pointer): Integer; // no need for binary compatibility, so you can omit cdecl
 begin
   TStream(p3).Write(p1^, StrLen(p1) + 1);
   TStream(p3).Write(p2, SizeOf(p2));
 end;

但是您将不得不重写整个C ++代码。如果您上面的代码已经有问题,这不是简单的事情。