【发布时间】:2020-09-11 14:03:07
【问题描述】:
我正在尝试从 Delphi 2.0 客户端应用程序调用 COM DLL(用 C# 编写)中的方法。 我试图调用的方法的参数之一是字符串数组。 查看通过将库导入到更高版本的 Delphi 中创建的单元,我看到字符串数组参数被定义为 PSafeArray。
此代码适用于 Delphi 2007:
stringToEcho := VarArrayCreate([0, 0], varVariant);
stringToEcho[0] := 'Hello World!';
oResponse := iface.RequestResponse('EXTests', 'Echo', PSafeArray(VarArrayAsPSafeArray(stringToEcho)), 30, '', true);
此 Delphi 2 代码在调用 RequestResponse 方法时在运行时导致“参数不正确”错误:
stringToEcho := VarArrayCreate([0, 0], varVariant);
stringToEcho[0] := 'Hello World!';
oResponse := iface.RequestResponse('EXTests', 'Echo', stringToEcho, 30, '', true);
很明显,变体数组不是安全数组,我需要一些方法来从变体数组中转换或提取 SafeArray,就像在 Delphi 2007 示例中所做的那样。
我查看了 OLE2 单元和系统单元。我可以在 System.pas 中看到一些变体数组支持例程,但没有变体数组 SafeArray 转换例程。
如何在 Delphi 2 中将 PSafeArray 传递给 COM 自动化服务器?
请注意,另一个不同点是我在 Delphi 2007 中使用早期绑定,而在 Delphi 2 中使用后期绑定。
【问题讨论】:
-
SafeArray与variant array不同。 stackoverflow.com/a/2878492/62576 有一些可能有帮助的链接。您也可以在此网站上搜索[delphi] safearray以查找其他相关的帖子。 -
我不了解 Delphi,但 COM 具有创建和填充 SAFEARRAY 的 API(它自己的类型,似乎是 RequestResponse 期望的类型):SafeArrayCreate、SafeArrayPutElement、SafeArrayDestroy、等等。也许这有帮助:stackoverflow.com/a/10803453/403671
-
你试过用 varOleStr 代替 varVariant 吗?