从pascal DLL / SO加载和调用C ++中的函数

时间:2017-05-02 10:30:43

标签: c++ dll pascal

我有一个已编译的库,我正在尝试从c ++代码访问这些函数。大多数函数都能正常工作,但是我将参数传递给接受数组作为参数的函数时遇到了一些麻烦。

pascal函数头定义为:

function MyFunc( const Name  : PAnsichar; 
                 const MyArr : array of single;
                 const ArrLength : Longint;
                 var output : single
                ): Longint;

我可以编译这个函数,并且在使用pascal加载函数并调用库中的函数时正确使用。注意:库是使用CDecl调用约定编译的。

但是我在使用C ++加载函数时遇到了麻烦。

该功能定义为:

typedef long (*MyFunc)(char *, float, long, float *);

我可以正确加载dll并正确访问所有功能,除了上面的一个。

long ArrLeng = 300;
float out;
float Arr[ArrLeng];
\\ fill the array

result = MyFunc((char *) "default", Arr[0], ArrLeng, &out);

我可以将调试器附加到库中并检查库读取的变量。奇怪的是,Name和ArrLeng变量正确传递,但数组未正确传递。

我做错了什么?我该如何将数组传递给库?

1 个答案:

答案 0 :(得分:0)

尝试将指针传递给第一个元素。 " Single"是一个所谓的开放数组,它是一个pascal结构,也传递数组边界信息。

但是当与cdecl afaik结合使用时,它会缩减为指向elementtype的指针。 (单*)至少Free Pascal,我不知道Delphi / Kylix做了什么。

如果有疑问,请让pascal调用它并检查生成的汇编程序。