【问题标题】:Passing array of string from Delphi 2 to COM Visible C# .net DLL将字符串数组从 Delphi 2 传递到 COM Visible C# .net DLL
【发布时间】: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 中使用后期绑定。

【问题讨论】:

  • SafeArrayvariant array 不同。 stackoverflow.com/a/2878492/62576 有一些可能有帮助的链接。您也可以在此网站上搜索 [delphi] safearray 以查找其他相关的帖子。
  • 我不了解 Delphi,但 COM 具有创建和填充 SAFEARRAY 的 API(它自己的类型,似乎是 RequestResponse 期望的类型):SafeArrayCreate、SafeArrayPutElement、SafeArrayDestroy、等等。也许这有帮助:stackoverflow.com/a/10803453/403671
  • 你试过用 varOleStr 代替 varVariant 吗?

标签: c# delphi com safearray


【解决方案1】:

谢谢大家。
我了解 Delphi Variant Array 不是 SafeArray。但他们很接近:) Delphi 的 VarArrayCreate 实际上调用的是 Win32 SafeArrayCreate。

我想我需要某种方法从 VariantArray 中提取 SafeArray,就像在 Delphi 2007 示例中所做的那样。 我确实尝试将 VarArrayAsPSafeArray 反向移植到 Delphi 2,但没有成功。 但是,我能够从 Delphi 2007 VarArrayRef 反向移植另一个辅助函数,这实际上在 Delphi 2 的后期绑定上下文中更有用。 所以现在一切都好。 顺便说一句 - 我确实尝试创建一个 varOLEStr 的 VarArray,但是在调用 RequestResponse 方法时这给了我一个“类型不匹配”错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2014-02-24
    • 2012-02-12
    相关资源
    最近更新 更多