【问题标题】:Send a String parameter from vfp 9 to a dll created on delphi 2007将字符串参数从 vfp 9 发送到在 delphi 2007 上创建的 dll
【发布时间】:2014-05-18 14:21:35
【问题描述】:

我正在尝试通过将字符串从 VFP 传递到 Delphi 的 DLL 来使用 Visual FoxPro 9 中的 Delphi 的 DLL。一旦我运行 VFP 代码,Foxpro 就会崩溃。我的字符串值小于 254 个字符。

在 delphi 的代码中包含 ShareMem 没有任何区别。似乎使用了错误的字符串类型,我真的不知道要编码的其他类型的字符串。

请帮我举例说明如何传递字符串。

dll 代码在 Delphi 中运行良好。

在 delphi 的 DLL 中...


library dll_examp_With_PARA;

uses
  ShareMem,
  SysUtils,
  Classes,
  Dialogs;

{$R *.res}

function showValues(var a:shortstring):shortstring; stdcall; export;

  begin
     Result:=('you passed ' + a);
  end;

  exports showValues;
end.

在 VFP 中.....


CLEAR ALL

LOCAL vfpString as String

DECLARE STRING showValues IN dll_examp_With_PARA.dll STRING 

vfpString = 'Hello World!'

    ? showValues(vfpString)

    CLEAR ALL

【问题讨论】:

  • 如果你的项目被非 Delphi 编写的东西使用,你不能使用ShareMem。从理论上讲,您的 Delphi DLL,尽管有一件事,应该没问题,假设这符合 VFP 的要求(我不知道)。也许这就是您在 VFP 项目中声明这一点的方式?例如,我在该声明中看不到任何类型的 stdcall
  • @jerry Vfp DECLARE 使用标准调用

标签: delphi dll visual-foxpro


【解决方案1】:

无法从 Foxpro 调用该 DLL。您将不得不修改 DLL 或用适配器包装它。问题是您正在使用不适合互操作的私有 Delphi 字符串类型。您必须了解不同的语言有不同的方式来表示字符数据。对于二进制互操作,双方必须使用相同的表示。

字符串从 Foxpro 作为指向 8 位 ANSI 字符的空终止数组的指针传递。在德尔福是PAnsiChar。这将允许您将字符串从 Foxpro 传递给 Delphi。另一方面,您需要 Foxpro 代码来分配足够大的字符串。然后 Delphi 代码可以将文本复制到 Foxpro 提供的内存中。因此,您还需要传递输出字符串缓冲区的长度,以便 Delphi 代码可以避免写入超出缓冲区的末尾。

添加Sharemem 无济于事。这允许两个 Delphi 模块共享同一个本机 Delphi 堆。互操作是困难的。通过反复试验,您将一事无成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多