在将此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中翻译以上内容?
非常感谢您!
答案 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 ++代码。如果您上面的代码已经有问题,这不是简单的事情。