所以我在从 C# 调用的 Delphi DLL 中有以下记录结构。
TItemPic = record
x, y : Integer;
id : Integer;
Hue : Integer;
Page : Integer;
ElemNum : Integer;
end;
TItemToken = record
id : Cardinal;
Arguments : String;
ElemNum : Integer;
end;
TItemType = record
ID : Integer;
Hue : Integer;
ItemPics : array of TItemPic;
ItemToken : array of TItemToken;
end;
和功能:
function GetItemInfo(index : Word) : TItemType;
现在我在 C# 中有以下翻译的结构:
public struct TItemPic
{
public int X { get; set; }
public int Y { get; set; }
public int ID { get; set; }
public int Hue { get; set; }
public int Page { get; set; }
public int ElemNum { get; set; }
}
public struct TItemToken
{
public uint ID { get; set; }
public TPCharStr Arguments { get; set; }
public int ElemNum { get; set; }
}
public struct TItemType
{
public uint ID { get; set; }
public int Hue { get; set; }
public TItemPic[] ItemPics { get; set; }
public TItemToken[] ItemToken { get; set; }
}
[DllImport("mydelphi.dll", EntryPoint = "GetItemInfo", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
internal static extern TItemType GetItemInfo(ushort index);
目标是这样的:
TItemType myItem = GetItemInfo(1);
我不确定如何处理 TItemType 记录中的开放数组ItemPics : array of TItemPic;
和ItemToken : array of TItemToken;
阅读 David Heffernan 的一些答案,我相信我可能应该将这些声明为 IntPtr 然后将数据复制到一个数组中——但是我不确定如何获取存储的元素数量。他指出,Delphi 开放数组将引用计数和数组大小存储在传递的指针的负偏移量处......但我不确定如何检索这些信息并将其转换:-)