2016-02-18 73 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/

相關問題