从delphi调用c ++函数

时间:2018-08-08 19:46:24

标签: c++ delphi dll

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

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

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

我已经在Delphi中制作了一个简单的应用程序来模拟应用程序的行为,并且运行良好。最大的问题是我没有有关应用程序内部的任何信息:没有源,没有文档,甚至没有日志。只是函数声明和参数描述。

在delphi中的函数声明:

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

DLL中的功能声明:

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

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

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

在此方面的任何帮助,我将非常感谢。

作为一个附带说明,DLL是使用Visual Studio编译的。这会导致问题吗?

1 个答案:

答案 0 :(得分:4)

您显示的DLL函数在您的Delphi代码中声明为错误。 var Buffer: Pointer在C语言中等同于void**,在C ++中等同于void*&,但肯定不像DLL函数所期望的那样char*。如果DLL正在分配内存以返回到应用程序,则使用void** / void*&参数会很有用,但根据您的描述不是这样。

请改用此Delphi声明:

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

PAnsiChar在Delphi中等同于char*在C / C ++中。

您应该阅读以下有关陷阱的博客文章,当将C / C ++声明转换为Delphi时要当心:

Rudy's Delphi Corner: Pitfalls of converting