Delphi函数和C ++中的等价物

时间:2013-10-15 17:25:40

标签: c++ delphi

旧库是用Delphi编写的。现在我正在尝试用c ++编写库。

下面是Delphi库中的函数:

function MyFunction(Path:string; Options:PInteger; var Data: array of Byte):Integer; stdcall;

这个函数应该如何在C ++中看?以下声明是对吗?

int __stdcall MyFunction(char* Path, int* Options, char* Data);

1 个答案:

答案 0 :(得分:2)

最大的问题是缓冲区。您的Delphi函数传递一个开放数组。这是通过将数组长度和指针传递给第一个元素来实现的。你的C ++翻译不会这样做。您需要传递一个额外的参数来指定数组的长度。

由于您可以预期函数不会修改Path,因此您可能会将第一个参数声明为const char*

因此,该函数将如下所示:

int __stdcall MyFunction(const char* Path, int* Options, size_t len, char* Data);

现在,如果您希望该函数与原始C ++版本可以二进制互换,那么您就会遇到问题。您需要匹配Delphi开放数组的内部实现。你可以做到这一点。该功能将成为:

int __stdcall MyFunction(const char* Path, int* Options, char* Data, int high);

请注意,length参数出现在指向第一个元素的指针之后,并且名为high。那是因为Delphi开放阵列接收high(A)而不是Length(A)

你必须摆脱跨越互操作边界传递Delphi特定类型的习惯。

当然,我在这里假设您仍在为互操作创建一个库,并且此函数位于互操作边界。如果函数是内部函数,则声明可能是:

void MyFunction(const std::string &path, int &options, 
    const std::vector<char> &data);

不需要返回值,因为错误可以通过异常发出信号。字符串存储在std::string中,C ++中的字节数组为std::vector<char>