c++ - Delphi 函数和 C++ 中的等效函数

标签 c++ delphi

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

下面是Delphi库中的函数:

function MyFunction(Path:string; Options:PInteger; var Data: array of Byte):Integer;标准调用;

这个函数在 C++ 中应该是什么样子?以下声明是否正确?

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

最佳答案

最大的问题是缓冲区。您的 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);

请注意,长度参数出现在指向第一个元素的指针之后,并命名为 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> .

关于c++ - Delphi 函数和 C++ 中的等效函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19387298/

相关文章:

c++ - 在C++中,是否有返回结束父函数的嵌套函数?

c++ - boost::variant - 为什么 "const char*"转换为 "bool"?

c++ - 如何在递归函数中计算返回结果?

c++ - 为什么这个函数级静态变量在 AIX 和 Solaris 中不是线程安全的?

delphi - 相同的代码,缺少 qtintf70.dll

delphi - 如何使用 Delphi 在 Windows Word 编辑器或 Pdf 编辑器中获取光标下的单词?

delphi - 修复Delphi的错误

Delphi XE5 和格式设置

delphi - 按名称设置属性值

c++ - std::unordered_map 使用 Visual C++ 2008 的未声明标识符