我用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编译的。这会导致问题吗?
答案 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时要当心: