2016-02-18 52 views
2

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

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

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

和类的声明,当我导入这个类作为COM对象德尔福将像

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) 

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

+0

你为什么要使用LPArray类型?恐怕,您将无法通过COM访问IAvailStatusMessage接口实例。使用中间的常规.Net类来封装接口,然后发布一个常规的L​​ist 。 –

+0

嗨Arnaud,我认为根据COM对象,我们只能发布接口。我没有测试过。而且,是否有可能将从管理代码发布到非托管代码?如果可能的话,它会很容易解决我的问题。如果您有任何参考链接,请发送。 – shyambabu

+0

'Idx' - 这个参数是什么类型? – kami

回答

0

经过一天的努力,发现问题的解决方案。 chaning两侧代码,后

德尔福端代码

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/

相关问题