从 delphi 调用 c++ 函数



我用C++编写了一个DLL,其函数将从Delphi应用程序调用。

DLL 中的一个函数将Pointer带到应写入 XML 字符串的缓冲区。 但是,当我将字符串写入缓冲区时,从函数返回后,应用程序崩溃并显示"地址 0048B 的访问冲突.......exe。写入地址 3030D......" 错误。

函数声明的调用约定在 DLL 和应用程序中是相同的。

我在 Delphi 中制作了一个简单的应用程序来模拟应用程序的行为,它工作正常。 最大的问题是我没有关于应用程序内部的任何信息:没有来源,没有文档,甚至没有日志。只是函数声明和参数说明。

德尔福中的函数声明:

function functionName(var Buffer: Pointer; var BuffLen: Integer): Integer; stdcall;

DLL 中的函数声明:

extern "C" int WINAPI functionName(char*, int*);

有人知道如何解决这个问题吗?

从我的测试中,我感觉问题出在应用程序中,而不是在 DLL 中。 但是,我对此并不完全确定。 我可以在 DLL 站点上执行任何可能的测试来解决问题或定位问题?

我真的很感激在这件事上的任何帮助。

作为旁注,DLL是使用Visual Studio编译的。这会导致问题吗?

您显示的 DLL 函数在 Delphi 代码中被声明为错误。var Buffer: Pointer等同于在 C 中void**,或在 C++ 中等效于void*&,但肯定不像 DLL 函数所期望的那样char*。 如果 DLL 分配内存以返回到应用程序,则使用void**/void*&参数将很有用,但从您的描述来看,情况并非如此。

请改用此德尔菲声明:

function functionName(Buffer: PAnsiChar; var BuffLen: Integer): Integer; stdcall;

德尔福的PAnsiChar相当于 C/C++ 中的char*

您应该阅读以下博客文章,了解将 C/C++ 声明转换为 Delphi 时要注意的陷阱:

鲁迪的德尔菲角:转换的陷阱

最新更新