这是delphi一个函数,我写了一个申明调用时提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏
//function  GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
//          stdcall; export;
        [DllImport("ANLOCK_2009.dll")]
        public static extern int GetMessageStr( uint iAddr,ref string sStr);

解决方案 »

  1.   

    //delphi:
    //function GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
    // stdcall; export;//C#:声明调用
      [DllImport("ANLOCK_2009.dll")]
      public static extern int GetMessageStr( uint iAddr,ref string sStr);
    //
    string temp = "";
    uint u_iAddr = 1;
    ANLOCK_2009.GetMessageStr(u_iAddr, ref temp);
      

  2.   

    你还要看看文档,要知道sStr参数需要多大的空间
      

  3.   


      //返回指针字符串
      function  GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
                external 'ANLOCK_2009.dll'; stdcall;sStr :PChar 这是一个指针字符串
      

  4.   

    返回的指针是指向非托管内存的,用IntPtr吧。
    不知道这个DLL规定怎么释放返回的内存,不释放的话会有内存泄漏的。
      

  5.   

    申明
      //返回指针字符串
      function  GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
                external 'ANLOCK_2009.dll'; stdcall;procedure TfrmDemo.CommWndProc( var msg: TMessage );
    var
      cCardInfo :PChar;
    begin
      case msg.msg of
        WM_DEVICECHANGE://当发卡器连接异常
           OpenMac(False); //这里实现自动打开
        PWM_CARDVAILD:
          begin
            GetMem(cCardInfo,250);
            try
              GetMessageStr(msg.lParam, cCardInfo);
              lstCardInfo.Items.CommaText := StrPas(cCardInfo);
            finally
              FreeMem(cCardInfo);
            end;
          end;
        PWM_CARDNOVAILD:
          lstCardInfo.Items.Text := '卡片无效';
        PWM_WRITEFAIL:
          ShowMessage('写卡失败');
        PWM_GETSYSCODE:
          ShowMessage('系统授权成功');
        PWM_GETREADERDATA:
          begin
            GetMem(cCardInfo,800);
            try
              GetMessageStr(msg.lParam, cCardInfo);
            finally
              FreeMem(cCardInfo);
            end;
          end;
      end;
    end;
      

  6.   

    那你给StringBuilder分配足够内存了吗?
    或者你用byte[]试试,也要分配内存
      

  7.   


    //C#:声明调用
      [DllImport("ANLOCK_2009.dll")]
      public static extern int GetMessageStr( uint iAddr,ref string sStr);
    //
    string temp = "";
    uint u_iAddr = 1;
    ANLOCK_2009.GetMessageStr(u_iAddr, ref temp);ANLOCK_2009.GetMessageStr(u_iAddr, ref temp);,直接GetMessageStr(u_iAddr, ref temp)好了
      

  8.   

    反向调试,使用delphi作为调试dll工具,.net写的程序作为宿主查找问题原因,不要死报着.net不放
      

  9.   

    很有道理,首先得保证你的ANLOCK_2009.dll能被delphi正常调用才行。。
      

  10.   

    PChar类型在C#里用byte[]对应。
    给个例子:
    [DllImport("ITMonitor")]
            private static extern uint NotifyException(byte[] sException, int iSeverity, int ExceptionType);string sWarning = "test";
    byte[] bytWarning = new byte[sWarning.Length + 1];
    bytWarning = System.Text.Encoding.ASCII.GetBytes(sWarning);//string to byte array
    NotifyException(bytWarning, 1, 2);