我使用Delphi来加载一个dll(我在Delphi XE-3中创建)用于与一些C代码接口的目的。我的问题是搞清楚为什么我的数组没有被传递给c函数 - 他们是唯一没有的。德尔福文件(简体)看起来是这样的:德尔福到C的dll:传递阵列
program CallcCode
uses
SysUtils, Windows,
DLLUnit in 'DLLUnit.pas'; // Header conversion
var
DLLHandle: cardinal;
n: Integer;
A: TArray<Integer>;
result1: Integer;
begin
// Initialize each Array
SetLength(A,n);
A[0] = ...;
// Load the DLL (and confirm its loaded)
DLLhandle := LoadLibrary('dllname.dll');
if DLLhandle <> 0 then
begin
result1 := dll_func1(n,A); // A and B are not passed correctly
end
FreeLibrary(DLLHandle);
end.
我成功 “跟踪到” dll_func1首次进入DLLUnit,其中有:
const
nameofDLL = 'dllname';
function dll_func1(n: Integer; A: TArray<Integer>): Integer; cdecl; external nameofDLL;
再次 “跟踪-成”,我到达在C文件,它仍然具有正确的n和DLLdefs值,但A(“本地变量”标题下)已经成为:
[-] A :(Aplha-Numeric)
..[0] 0 (0x00000000)
我知道我至少访问该DLL(希望)正确的导致其他函数调用正常工作,并且我可以在没有问题的情况下跟踪到dll_func1.c文件。我试图改变功能
function dll_func1(n: Integer; A: PInteger): Integer; cdecl; external nameofDLL;
...
result1 := dll_func1(n,PInteger(A))
或
function dll_func1(n: Integer; A: PInteger): Integer; cdecl; external nameofDLL;
...
result1 := dll_func1(n,@A[0])
(同时使用在tarray和整数数组或A),但没有任何改变,这让我相信这是关系到一个问题,我没有看到。整个事情编译和运行,但由于TArray失败,result1不正确。有什么想法出错?
编辑 C语言中的功能:
int dll_func1(int n, int A [])
你只需要做我在回答你的上一个问题时告诉你的。密切关注我写的内容。你在这里没有什么喜欢的。那么,问题的后半部分是。我怀疑结构是错误的。你为什么不写一个C函数,它只需要一个数组并且试图通过它。然后变得更加雄心勃勃。 –
我在函数调用(单元文件)中写了'PInteger',在程序文件(我初始化它们的地方)中将它们定义为'TArray',并使用了'solve(n,PInteger(Ap),PInteger(Ax)) ';只有数组没有传递给函数。你是什么意思的结构传递不正确? –
编号PInteger是预定义的类型。不要将它重新定义为别的东西。删除所有的声明。它被声明为PInteger =^Integer –