Конвертировать функцию обратного вызова C ++ в Delphi - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужна помощь в переводе этого заголовка C ++ в Delphi.

Это прототип функции обратного вызова и некоторые встроенные функции (я не имею четкого представления, почему они есть, поскольку кажется, что они не используются).

Исходный код .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 Souce:

#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 вышеупомянутое ??

Спасибо большое!

1 Ответ

0 голосов
/ 27 февраля 2019

Ваш перевод неверен.Вероятно, это должно быть:

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

Обратите внимание, что Delphi-эквивалент для const char *x не существует (неконстантный указатель на константные символы), поэтому просто используйте PAnsiChar.В любом Delphi с 2009 года PChar - это PWideChar, и это не эквивалентно char *.

const x: PAnsiChar является эквивалентом char * const x, то есть указатель является константой, а не символом, на который он указывает.

И это очень вероятночто ваше соглашение о вызовах неверно.

Точно так же вы должны перевести другие функции.Но обратите внимание, что функция (метод) в структуре может вызываться по-разному, то есть с использованием запатентованного соглашения Microsoft для методов (__thiscall).Для него нет Delphi-эквивалента.

Но, вероятно, вы не можете вызывать такие методы, не столкнувшись с проблемами совместимости. Вы можете имитировать поведение этих классов / структур , но вы не сможете сделать их бинарно совместимыми в Delphi , если вы не перепрыгнете через несколько обручей и / или не используете ассемблер.

Больше информации на моем сайте:

Если вы хотите mimic поведение, вы можете сделать что-то вроде:

 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 ++.Это не что-то простое, если у вас уже есть проблемы с кодом выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...