我尝试通过将字符串从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
答案 0 :(得分:1)
无法从Foxpro调用该DLL。您将不得不修改DLL或用适配器包装它。问题是您使用的是不适合互操作的私有Delphi字符串类型。您必须了解不同的语言有不同的方式来表示字符数据。对于二进制互操作,双方必须使用相同的表示。
从Foxpro传递字符串作为指向8位ANSI字符的以空值终止的数组的指针。在Delphi中PAnsiChar
。这将允许您将Foxpro中的字符串传递给Delphi。在另一个方向,您需要Foxpro代码分配足够大的字符串。然后Delphi代码可以将文本复制到Foxpro提供的内存中。因此,您还需要传递out字符串缓冲区的长度,以便Delphi代码可以避免写入超出缓冲区的末尾。
添加Sharemem
无济于事。这允许两个Delphi模块共享相同的本机Delphi堆。互操作很困难。你无法通过反复试验获得任何好处。