gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:23:45 25 4
gpt4 key购买 nike

我需要帮助将此 C++ header 翻译成 Delphi。

它是一个回调函数原型(prototype),和一些内联函数(我不清楚它们为什么在那里,因为它们似乎没有被使用)。

源.h代码:

// 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);

上面的很简单:它应该在 Delphi 中翻译如下:

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


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

源.h代码:

#include <ostream>

namespace ns1 {
namespace ns2 {

inline int OstreamWriter(const char *p1, int p2, void *p3);

struct StreamProxyOstream {

static int writeToStream(const char* p1, int p2, void *p3);
// Format, to the specified 'p3' stream, which must be a pointer to a
// 'std::ostream', the specified 'p2' bytes length of the specified 'p1' data.
};


inline
int StreamProxyOstream::writeToStream(const char *p1,
int p2,
void *p3)
{
reinterpret_cast<std::ostream*>(p3)->write(p1, p2);
return 0;
}

inline
int OstreamWriter(const char *p1, int p2, void *p3)
{
return StreamProxyOstream::writeToStream(p1, p2, p3);
}

} // close namespace ns2
} // close namespace ns1

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

非常感谢!

最佳答案

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

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,意味着 pointer 是 const,而不是它的 char(s)指向。

而且很可能你的调用约定是错误的。

同样,您应该翻译其他功能。但请注意,结构上的函数(方法)可能有不同的调用方式,即使用专有的 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++ 代码。如果您对上面的代码已经有问题,这并不简单。

关于c++ - 将 C++ 回调函数转换为 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54908415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com