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

时间:2016-02-18 09:32:31

标签: c# .net delphi interop

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

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

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

当我将这个类作为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对象。但是,当我使用函数

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

我收到错误,如“参数不正确”。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

经过一天的挣扎,找到了问题的解决方案。 chaning双方代码后,

Delphi边码

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

.Net边码

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/