2016-02-18 1 views
2

Я использую концепцию взаимодействия между Delphi и C#. Я создал классы в C# и импортировал эти классы в проект delphi как COM-объекты. Объявление класса в C# кодСоздание SafeArray с объектами определенного типа пользователя

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

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

И когда я импортировать этот класс как объект ком Дельфы, который будет как

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 типы? Боюсь, вы не сможете получить доступ к экземплярам интерфейса IAvailStatusMessage через COM. Используйте обычный промежуточный класс .Net, который инкапсулирует интерфейсы, а затем публикует обычный список . –

+0

Hi Arnaud, я думаю По объектам COM мы можем только публиковать интерфейсы. Я не проверял это. И, возможно ли опубликовать список из управляемого кода в неуправляемый код? если это возможно, то это легко разрешит мою проблему. Если у вас есть ссылка, отправьте ее. – shyambabu

+0

'Idx' - какой тип этого параметра? – kami

ответ

0

После дня борьбы найдено решение проблемы. После чейнинга код обеих сторон, как,

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/