使用用户定义的类型对象创建 SafeArray

Creating SafeArray with user defined type objects

我在 Delphi 和 c# 之间使用互操作性概念。我在 C# 中创建了 classes,并将这些 classes 作为 com 对象导入到 delphi 项目中。 c# 代码中的 class 声明

public class HotelAvailNotifRQ : IHotelAvailNotifRQ
{
    [MarshalAs(UnmanagedType.LPArray)]
    public IAvailStatusMessage[] AvailStatusMessagesField;

    public IAvailStatusMessage[] AvailStatusMessages
    {
        get { return AvailStatusMessagesField; }
        set { AvailStatusMessagesField = value; }
    }
}

当我将此 class 作为 com 对象导入到 delphi 时,就像

IHotelAvailNotifRQ = interface(IDispatch)
  ['{2F7C57D7-256A-3102-A4C6-FD081C8342B4}']
  function Get_AvailStatusMessages: PSafeArray; safecall;
  procedure Set_AvailStatusMessages(pRetVal: PSafeArray); safecall;
  property AvailStatusMessages: PSafeArray read Get_AvailStatusMessages  write Set_AvailStatusMessages;
end;

我可以成功创建 IAvailStatusMessage 对象。但是,当我使用 function

将这个对象放入 PSafeArray 时
SafeArrayPutElement(HotelAvailNotifRQ.AvailStatusMessages, Idx, AvailStatusMessage)

我收到类似 "the parameter is incorrect" 的错误。请帮我解决这个问题。

经过一天的努力,找到了解决问题的方法。将双方代码更改为后,

Delphi边码

var
  varAvailStatusMessages : Variant;
begin
    varAvailStatusMessages := VarArrayCreate([0, AvailStatusMessages.Count], varDispatch);
    varAvailStatusMessages[asmIdx] := AvailStatusMessage;
    Result.AvailStatusMessages := PSafeArray(TVarData(varAvailStatusMessages).VArray);
end;

.网端代码

public class HotelAvailNotifRQ : IHotelAvailNotifRQ
{
   [MarshalAs(UnmanagedType.Interface)]
   public IAvailStatusMessage[] AvailStatusMessagesField;

   public IAvailStatusMessage[] AvailStatusMessages
   {
    get { return AvailStatusMessagesField; }
    set { AvailStatusMessagesField = value; }
   }
}

感谢您的参考, http://blog.virtec.org/2008/07/the-mysteries-of-psafearray/