delphi定义了一个结构体
THF_MeterPackData = record
h_OPFlag: Integer;
h_FactPayAmount: double;
h_AmmeterID: Int64;
h_AreaID: Integer;
h_SysCode: Integer;
h_MeterType: Integer;
h_HgBaute: Integer;
h_MaxAllowLoad: Integer;
h_AmmeterConstant : Integer;
h_CutAmount: double;
h_baojing: double;
h_WaterNo : integer;
h_AmmeterStatus: Integer;
h_RemainAmount: double;
h_MeterMode: Integer;
h_Price:double;
h_StepPrice: array[0..3] of double;
h_StepAmount: array[0..3] of double;
h_PriceDateTime:TDateTime;
h_ParaVer:Integer;
h_TJAmount:double;
h_PlugDate: TDateTime;
h_CardVer:Integer;
h_IsInsert : Integer;
h_meterCode:Int64;
h_MonthAmount: array[0..11] of Double;
End;
一个指针
Phf_MeterPackData = ^THF_MeterPackData;
一个方法
function Read_Card_Public(m_Data: Phf_MeterPackData) : Integer; stdcall; external 'xxx.dll';
c# 调用这个动态库的Read_Card_Public方法时,使用的也是结构体指定IntPtr,为什么到h_AmmeterID值时还正常,后面全都没有值了?用delphi自身调用就没问题?
THF_MeterPackData data = InitInfo();
int len = Marshal.SizeOf(data);//计算对象大小
IntPtr ptr = Marshal.AllocHGlobal(len);//从非托管内存中分配内存
Marshal.StructureToPtr(data, ptr, true);//将数据从托管对象封送到非托管内存块
ret = API.HFmeterAPI.Read_Card_Public(ref ptr);
c# 中定义的结构体
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct THF_MeterPackData
{
public int h_OPFlag;
public Double h_FactPayAmount;
public Int64 h_AmmeterID;
public int h_AreaID;
public int h_SysCode;
public int h_MeterType;
public int h_HgBaute;
public int h_MaxAllowLoad;
public int h_AmmeterConstant;
public Double h_CutAmount;
public Double h_baojing;
public int h_WaterNo;
public int h_AmmeterStatus;
public Double h_RemainAmount;
public int h_MeterMode;
public Double h_Price;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.Struct)]
public Double[] h_StepPrice;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.Struct)]
public Double[] h_StepAmount;
public DateTime h_PriceDateTime;
public int h_ParaVer;
public Double h_TJAmount;
public DateTime h_PlugDate;
public int h_CardVer;
public int h_IsInsert;
public Int64 h_meterCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12, ArraySubType = UnmanagedType.Struct)]
public Double[] h_MonthAmount;
}