从 c++ dll 返回 double* 到 delphi 程序
Return double* from c++ dll to delphi program
我试图将double
数组(声明为double*)返回给delphi程序。在c ++ dll项目中,我有
#define DllExport __declspec( dllexport )
extern double* array;
extern "C"
{
DllExport double* SomeMethod(double);
}
卸载 Dll 时array
被删除
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*
,在德尔福中,我使用 PAnsiChar
更新
下面是编写SomeMethod
的文件的一些C++代码。
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
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- DLL函数导出一个指针做Delphi程序
- 将C DLL导出到Delphi程序
- 如何将DLL注入Delphi程序
- 将数据从Delphi DLL传递到C++应用程序中
- 将二进制数据从Qt/C++DLL传递到Delphi主机应用程序中
- 从 c++ dll 返回 double* 到 delphi 程序
- 使用消息处理程序将 c++ dll 调用转换为 delphi
- MFC应用程序中Delphi 7和Delphi XE4之间的ActiveX差异
- 从C++DLL中调用Delphi应用程序
- 在Delphi应用程序中使用c++ DLL回调函数
- 在Delphi应用程序中调用C++DLL
- Delphi与C++Builder之比较——对于做Win32的Java程序员来说,这是更好的选择