gpt4 book ai didi

c++ - 将 double* 从 c++ dll 返回到 delphi 程序

转载 作者:行者123 更新时间:2023-11-28 07:20:35 25 4
gpt4 key购买 nike

我试图将 double 的数组(声明为 double*)返回给 delphi 程序。在 c++ dll 项目中我有

#define DllExport   __declspec( dllexport )
extern double* array;
extern "C"
{
DllExport double* SomeMethod(double);
}

array 在卸载 Dll 时被删除

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{

switch( ul_reason_for_call )
{
...

case DLL_PROCESS_DETACH:
delete [] array;
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}

当我在 C++ 控制台应用程序中测试我的 dll 时,我在使用 dll 中的 SomeMethod 后得到了正确的结果。接下来我尝试在 Delphi 中测试我的 dll,但是方法返回的数组内容是错误的。我使用了以下代码。

TSomeMethod = function(level : Double): PDouble; cdecl;
...
var
SomeMethod: TSomeMethod;
arr: PDouble;
...
if Assigned(SomeMethod) then
begin
arr:= SomeMethod(15);
writeln(arr^:2:0);
inc(arr);
writeln(arr^:2:0);
end
...

从 c++ dll 返回 double* 以在 delphi 中使用的正确方法是什么?

附言其他方法以正确的方式工作。例如 dll 返回 char* 并且在 delphi 中我使用 PAnsiChar

得到它

更新

这是一些来自文件的 C++ 代码,其中写有 SomeMethod

double* array; // yea it's an array that declared as external in other file;
...
double* SomeMethod(double level)
{
...
deque<double> arrayToReturn;
... // some actions with deque
array= new double[arrayToReturn.size()];
for (unsigned int i = 0; i<arrayToReturn.size(); i++)
array[i] = arrayToReturn[i];
return array;
}

最佳答案

您问题中的代码工作正常。这意味着问题出在其他地方。证明如下:

C++

#include <Windows.h>

BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

extern "C" {

__declspec(dllexport) double* SomeMethod(double)
{
double* array = new double[2];
array[0] = 42;
array[1] = 666;
return array;
}

}

德尔福

{$APPTYPE CONSOLE}

uses
Windows, SysUtils;

type
TSomeMethod = function(level : Double): PDouble; cdecl;

var
SomeMethod: TSomeMethod;
arr: PDouble;
lib: HMODULE;

begin
lib := LoadLibrary('MyDll.dll');
Win32Check(lib<>0);
SomeMethod := GetProcAddress(lib, 'SomeMethod');
Win32Check(Assigned(SomeMethod));
arr:= SomeMethod(15);
Writeln(arr^:3:0);
inc(arr);
Writeln(arr^:3:0);
Readln;
end.

输出

 42666

关于c++ - 将 double* 从 c++ dll 返回到 delphi 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com