delphi的接口方法是这样的:
procedure GetLastCashCardBalance(Card:PTMemberCashCard_Rd);stdcall;
begin
  Card.iMemberID := FPosService.LastCashCardBalance.iMemberID;
  SetPChar(@Card.sMemberCode[0], FPosService.LastCashCardBalance.sMemberCode);
  DateTimeToSystemTime(FPosService.LastCashCardBalance.dateValid,Card.dateValid);
  Card.mBalance := FPosService.LastCashCardBalance.mBalance;
  Card.mBottom := FPosService.LastCashCardBalance.mBottom;
  Card.mAmount := FPosService.LastCashCardBalance.mAmount;
end;
其中PTMemberCashCard_Rd是这么定义的
 { TMemberCashCard = class
    iMemberID: integer;
    sMemberCode: string;
    dateValid: TDate;
    mBalance: TMoney;
    mBottom: TMoney;
    mAmount: TMoney;
    bRecycle: boolean;
  public
    procedure Clear;
  end; }  TMemberCashCard_Rd =  Record
    iMemberID: integer;
    sMemberCode: Array[0..255] of char;
    dateValid: SystemTime;
    mBalance: integer;
    mBottom: integer;
    mAmount: integer;
    bRecycle: Integer;
  end;  PTMemberCashCard_Rd =^TMemberCashCard_Rd;我在C#里的调用方法如下
定义结构
 public struct LastCashCardBalance
        {
            public Int32 iMemberID;
            public string  sMemberCode;
            public DateTime dateValid;
            public Int32 mBalance;
            public Int32 mBottom;
            public Int32 mAmount;
            public Int32 bRecycle;
        }  [DllImport("CardInterface.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
  public static extern void GetLastCashCardBalance( LastCashCardBalance s);调用:
LastCashCardBalance lst = new LastCashCardBalance();
 GetLastCashCardBalance(lst);
提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏。求大侠帮忙看看是什么原因啊

解决方案 »

  1.   

    我把 LastCashCardBalance 改成这样,传进去调用,不报错,但是得不到值
    public class LastCashCardBalance
        {
            private Int32 MemberID;
            private char[] MemberCode=new char[256];
            private DateTime dateValid;
            private Int32 Balance;
            private Int32 Bottom;
            private Int32 Amount;
            private Int32 Recycle;        public Int32 iMemberID
            {
                set { MemberID = value; }
                get { return MemberID; }
            }
            public char[] sMemberCode
            {
                set { MemberCode = value; }
                get { return MemberCode; }
            }        public DateTime sdateValid
            {
                set { dateValid = value; }
                get { return dateValid; }
            }
            public Int32 iBalance
            {
                set { Balance = value; }
                get { return Balance; }
            }
            public Int32 iBottom
            {
                set { Bottom = value; }
                get { return Bottom; }
            }
            public Int32 iAmount
            {
                set { Amount = value; }
                get { return Amount; }
            }
            public Int32 iRecycle
            {
                set { Recycle = value; }
                get { return Recycle; }
            }    }
      

  2.   

    ref LastCashCardBalance s另外delphi中不要用string类型,改为array of byte 或 array of char
      

  3.   

    谢谢前辈,我改成这样
     public struct LastCashCardBalance
            {
                public Int32 iMemberID;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst =256)]
                public char[] sMemberCode;
                public DateTime  dateValid;
                public Int32 mBalance;
                public Int32 mBottom;
                public Int32 mAmount;
                public Int32 bRecycle;
            }    [DllImport("CardInterface.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
       public static extern void GetLastCashCardBalance(ref LastCashCardBalance s);调用:
    LastCashCardBalance lst = new LastCashCardBalance();
      GetLastCashCardBalance(ref lst);
    可以调用成功了,但是返回值除了iMemberID是正确的,其他都不对,要么是空,要么是0