凌云天下 2021-09-28 14:05 采纳率: 100%
浏览 10
已结题

c#调用delphi动态库?

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;
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月6日
    • 创建了问题 9月28日

    悬赏问题

    • ¥15 微信会员卡接入微信支付商户号收款
    • ¥15 如何获取烟草零售终端数据
    • ¥15 数学建模招标中位数问题
    • ¥15 phython路径名过长报错 不知道什么问题
    • ¥15 深度学习中模型转换该怎么实现
    • ¥15 HLs设计手写数字识别程序编译通不过
    • ¥15 Stata外部命令安装问题求帮助!
    • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
    • ¥15 TYPCE母转母,插入认方向
    • ¥15 如何用python向钉钉机器人发送可以放大的图片?