Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Delphi调用C++函数 我在C++中编写了一个DLL,其功能将由Delphi应用程序调用。_C++_Delphi_Dll - Fatal编程技术网

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

从Delphi调用C++函数 我在C++中编写了一个DLL,其功能将由Delphi应用程序调用。,c++,delphi,dll,C++,Delphi,Dll,DLL中的一个函数获取指向缓冲区的指针,缓冲区中应该写入XML字符串。但是,当我将字符串写入缓冲区时,在从函数返回后,应用程序在地址0048B处发生访问冲突而崩溃。。。在模块中…exe。写入地址3030D。。。错误 在DLL和应用程序中,函数声明的调用约定是相同的 我在Delphi中制作了一个简单的应用程序来模拟应用程序的行为,效果很好。最大的问题是,我没有关于应用程序内部的任何信息:没有来源,没有文档,甚至没有日志。只是函数声明和参数描述 delphi中的函数声明: function func

DLL中的一个函数获取指向缓冲区的指针,缓冲区中应该写入XML字符串。但是,当我将字符串写入缓冲区时,在从函数返回后,应用程序在地址0048B处发生访问冲突而崩溃。。。在模块中…exe。写入地址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编译的。这会导致问题吗?

您显示的DLL函数在您的Delphi代码中声明为错误。VAR缓冲区:指针等效于C中的空缺**,或者Value*+C++,但肯定不会像DLL函数所期望的那样变成char。如果DLL正在分配内存以返回应用程序,则使用void**/void*&参数将非常有用,但根据您的描述,情况并非如此

请改用此Delphi声明:

function functionName(Buffer: PAnsiChar; var BuffLen: Integer): Integer; stdcall;
Delphi中的PAnsiChar相当于C/C++中的char*

您应该阅读以下关于将C/C++声明转换为Delphi时要注意的问题的博客文章:


缓冲区的内存分配在哪里?如果没有应用程序如何调用函数的代码,就很难确定问题出在哪里。可能显示工作的代码内存在application side@RichardCrittenAs中分配给函数调用,我们没有应用程序源代码,因此不知道如何执行调用@DaveNottage@Sargis您不需要应用程序源代码。您只需要正确地转换DLL声明,但实际上并非如此。从技术上讲,var Buffer:指针是否等效于void*&或void&*无法确定这两个修饰符的顺序。空**将是缓冲区:pPosiple,pPosith= ^指针。@心音顺序是空的*,是的,你是正确的,从C++的角度来看。从C的角度来看,它是空的**,甚至在C++中,Value**也会很好地工作。因此,这将是我的首选翻译。但是,无符号字符**可能会使用太多的二进制表示,并且可能更容易在DLL中使用。无论如何,翻译是失败的艺术-