【问题标题】:What is the Delphi equivalent for LPLONG?LPLONG 的 Delphi 等价物是什么?
【发布时间】:2019-05-30 02:34:01
【问题描述】:

我必须从 Delphi(当前为 Delphi7)访问用 c 编写的 DLL 的几个函数。 当参数是标量时,我可以毫无问题地做到这一点 (感谢在这个很棒的网站上找到的示例!),但是当参数中有一个指向 Longs 数组的指针时,我已经卡住了一段时间。

这是其中一个函数在头文件中的定义:

BOOL __stdcall BdcValida (HANDLE h, LPLONG opcl);

(opcl 是一个 long 数组)

这是我的 Delphi 代码的一部分:

type
  TListaOpciones= array of LongInt; //I tried with static array too! 
  Popcion = ^LongInt; //tried with integer, Cardinal, word...  
var
  dllFunction: function(h:tHandle;  opciones:Popcion):boolean;stdcall;
  arrayOPciones:TListaOpciones;
  resultado:boolean;
begin
  .....
  I give values ​​to aHandle and array arrayOPciones
  .....
  resultado:=dllFunction(aHandle, @arrayopciones[0]);
end;

执行时的错误信息是:

"项目 xxx 引发了太多连续异常:访问冲突 在 0x000 ..”

LPLONG 在 Delhpi 中的等价物是什么?还是我以不正确的方式调用该函数? 谢谢!

【问题讨论】:

  • 我必须承认我发现函数调用令人困惑,因为如果 opcl 真的是指向数组的指针,而不是单个变量,我看不出 DLL 是如何知道的那个数组很大——也就是说没有参数告诉它,除非它存储在 h 指向的任何地方。
  • DLL 知道数组的大小,它根据上下文而变化,我们通过通知它的 dll 函数知道它。
  • 您是说有一个不同的函数来设置 DLL 的数组长度。你确定你设置正确吗?也许您传递的值太高(可能是一个)。
  • 缺少代码的相关位,以了解内存分配和释放的对象和位置以及数组大小是如何传递的。

标签: delphi dll interop


【解决方案1】:

LONG 映射到 LongintLPLONG 映射到 ^Longint。所以,您已经正确翻译了该类型。

不过,您已错误地翻译了BOOL。在 Delphi 中应该是 BOOLLongBool。两者都可以,前者是后者的别名。

您的错误在于我们看不到的代码或细节。也许您没有分配数组。也许数组的大小不正确。也许句柄无效。可能之前对 DLL 的调用未能检查错误。

【讨论】:

  • 感谢大卫,我已经尝试过正确分配的静态和动态数组。句柄是有效的(它适用于 dll 的其他功能)。我认为之前对 DLL 的调用不是问题(如果我调用另一个函数,它不会给出错误)我将更正 BOOL 并尝试
  • 更改BOOL 不会有任何影响。无论您的问题在哪里,它都不在提供的代码中。
猜你喜欢
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多