【问题标题】:Boolean parameter in a dll function in delphi 7delphi 7中dll函数中的布尔参数
【发布时间】:2011-05-05 13:25:27
【问题描述】:

我有一个 dll 库。我已经排除了 delphi 类型的内存单元。

这样,函数声明的合适Boolean 类型是什么?

BOOL还是别的什么?

问题在于方法签名中:

function Test(Param1: BOOL; Param2: BOOL; docContent: PCharArray): Integer;

当程序离开该功能时,我得到了 AV。

我认为是这两个第一个参数的数据类型有问题。

【问题讨论】:

  • 根据我的经验,布尔值永远不会导致 AV。 PCharArray 是我的候选人。是输入缓冲区还是输出缓冲区?
  • 它是:PCharArray = PChar 数组;奇怪...现在我的错误消失了...:|
  • "array of PChar" 是一个动态数组,因此您需要在您的 dll 和主项目中使用 ShareMem-unit。或者使用固定大小的数组“array[0..9] of PChar”。
  • 或者使用PPAnsiChar,并在单独的参数中传递PAnsiChar元素的数量。

标签: delphi dll boolean


【解决方案1】:

BOOL 适用于布尔类型。它是 Windows 类型,因此您将在 Windows.pas 中的所有函数中看到它。

从 DLL 函数返回时访问冲突通常表明您的调用约定错误 — 默认调用约定是 register,但您可能需要 stdcallcdecl。将其添加到声明的末尾:

function Test(Param1: BOOL; Param2: BOOL; docContent: PCharArray): Integer; stdcall;

【讨论】:

  • 1.好吧,它与 cdecl 一起工作。它是什么? 2.当我运行这个过程(false,false,param)这样的方法时它也确实有效,但是当我放置布尔参数时:procedure(booleanParam,booleanParam2,param)它没有
  • 不要猜测使用什么调用约定。找出 DLL 真正 使用什么,然后在您的 Delphi 声明中指定它。这可能是也可能不是真正的问题,但出错可能会导致任何形式的失败,因此在探索其他问题之前消除这种可能性。
  • 这个dll是我的,也是用delphi 7编写的。dll中的哪个东西决定了调用约定?
  • 如果你负责编写双方,那么你只需要确保两者都使用相同的东西,不管它是什么。 DLL 通常使用 stdcall。
  • Paul,如果您的程序仅在函数使用 cdecl 时才有效,而在 DLL 和 EXE 都使用其他调用约定时不起作用,那么调用约定不是问题。我认为您已经回答了您提出的问题,即 BOOL 是否适合使用。您应该就您的访问违规提出一个新问题;在其中包含一个演示崩溃的最小可编译示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2014-07-02
相关资源
最近更新 更多