使用用户定义的类型对象创建 SafeArray
Creating SafeArray with user defined type objects
我在 Delphi 和 c# 之间使用互操作性概念。我在 C# 中创建了 classes,并将这些 classes 作为 com 对象导入到 delphi 项目中。
c# 代码中的 class 声明
public class HotelAvailNotifRQ : IHotelAvailNotifRQ
{
[MarshalAs(UnmanagedType.LPArray)]
public IAvailStatusMessage[] AvailStatusMessagesField;
public IAvailStatusMessage[] AvailStatusMessages
{
get { return AvailStatusMessagesField; }
set { AvailStatusMessagesField = value; }
}
}
当我将此 class 作为 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 对象。但是,当我使用 function
将这个对象放入 PSafeArray 时
SafeArrayPutElement(HotelAvailNotifRQ.AvailStatusMessages, Idx, AvailStatusMessage)
我收到类似 "the parameter is incorrect" 的错误。请帮我解决这个问题。
经过一天的努力,找到了解决问题的方法。将双方代码更改为后,
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; }
}
}
感谢您的参考,
http://blog.virtec.org/2008/07/the-mysteries-of-psafearray/
我在 Delphi 和 c# 之间使用互操作性概念。我在 C# 中创建了 classes,并将这些 classes 作为 com 对象导入到 delphi 项目中。 c# 代码中的 class 声明
public class HotelAvailNotifRQ : IHotelAvailNotifRQ
{
[MarshalAs(UnmanagedType.LPArray)]
public IAvailStatusMessage[] AvailStatusMessagesField;
public IAvailStatusMessage[] AvailStatusMessages
{
get { return AvailStatusMessagesField; }
set { AvailStatusMessagesField = value; }
}
}
当我将此 class 作为 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 对象。但是,当我使用 function
将这个对象放入 PSafeArray 时SafeArrayPutElement(HotelAvailNotifRQ.AvailStatusMessages, Idx, AvailStatusMessage)
我收到类似 "the parameter is incorrect" 的错误。请帮我解决这个问题。
经过一天的努力,找到了解决问题的方法。将双方代码更改为后,
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; }
}
}
感谢您的参考, http://blog.virtec.org/2008/07/the-mysteries-of-psafearray/