C# 使用用户定义的类型对象创建SafeArray
我正在使用Delphi和c#之间的互操作性概念。我在c#中创建了类,并将这些类作为com对象导入delphi项目。 c#代码中的类声明 当我将这个类作为com对象导入delphi时C# 使用用户定义的类型对象创建SafeArray,c#,.net,delphi,interop,C#,.net,Delphi,Interop,我正在使用Delphi和c#之间的互操作性概念。我在c#中创建了类,并将这些类作为com对象导入delphi项目。 c#代码中的类声明 当我将这个类作为com对象导入delphi时 IHotelAvailNotifRQ = interface(IDispatch) ['{2F7C57D7-256A-3102-A4C6-FD081C8342B4}'] function Get_AvailStatusMessages: PSafeArray; safecall; procedure Se
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对象。但是,当我使用函数将这个对象放入数组时
SafeArrayPutElement(HotelAvailNotifRQ.AvailStatusMessages, Idx, AvailStatusMessage)
我得到的错误类似于“参数不正确”。请帮我解决这个问题。经过一天的努力,终于找到了解决问题的办法。将双方代码更改为后 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; }
}
}
.Net端码
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; }
}
}
谢谢你的推荐,
为什么要使用LPArray类型?恐怕您无法通过COM访问IAvailStatusMessage接口实例。在两者之间使用一个普通的.Net类来封装接口,然后发布一个常规列表。嗨,Arnaud,我认为根据COM对象,我们只能发布接口。我没有对此进行测试。还有,是否可以将列表从托管代码发布到非托管代码?如果可能的话,它将很容易解决我的问题。如果您有任何参考链接,请将其发送。
Idx
-此参数的类型是什么?其整数类型的参数。我用一维整数数组进行了测试。如果idx
是整数,请尝试SafeArrayPutElement(HotelAvailNotifRQ.AvailStatusMessages,@idx,AvailStatusMessages)