1

旧库是用 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);

4

1 回答 1

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>.

于 2013-10-15T17:31:00.000 回答