Ese Ochuko Ответов: 1

Попытка чтения или записи защищенной памяти. Это часто является признаком того, что другая память нарушена


Всем привет
я уже давно занимаюсь этим, у меня есть приложение c# winform, которое вызывает неуправляемую 32-битную библиотеку dll c++, но всякий раз, когда я пытаюсь ее вызвать, приложение либо падает, либо приносит исключительную ошибку

"Попытка чтения или записи защищенной памяти. Это часто является признаком того, что другая память нарушена"

ниже приведен пример моего кода, я делаю что-то не так!

Записи:
я попытался изменить свою целевую платформу на X86
я даже попытался снять флажок "подавить загрузку модуля оптимизации JIT"

но никто не решил проблему

любая помощь будет очень признательна.

Что я уже пробовал:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Unit1
{
    public partial class TForm1: Form
    {       
        public TForm1()
        {
            InitializeComponent();
        }

 private bool rdCard()
        {
            bool result = false;
             int st;
            //result = false;
            // Units.Unit1.bufCard = "";
           Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;

            st = Units.Unit1.ReadCard(Units.Unit1.flagUSB, Units.Unit1.bufCard);
          
            if (st != 0)
            {
                MessageBox.Show(("Read Card Failure" + '\n' + (st).ToString() + "the buf: " + Units.Unit1.bufCard), "Note", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Error);
                return result;
            }
            if (Units.Unit1.bufCard.Substring(0, 6) != "551501")
            {
                MessageBox.Show(("No Valid Card On Reader" + '\n' + Units.Unit1.bufCard), "Note", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
               return result;
            }
            else
            {
                result = true;
                Cursor.Current = System.Windows.Forms.Cursors.Default;
                return result;
            }
        }

 // Read Card Data
        public void BitBtn3Click(System.Object Sender, System.EventArgs _e1)
        {
            if (!rdCard())
            {
                return;
            }
            // Read Card
            edt_CardData.Text = Units.Unit1.bufCard;
            //@ Unsupported function or procedure: 'copy'
            MessageBox.Show((("Card ID£º" + Units.Unit1.bufCard.Substring(25, 8))), "Note", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
        }
    }
}


namespace Unit1.Units
{
    public class Unit1
    {       
        public static TForm1 Form1 = null;
        public static byte flagUSB = 0;
        // Reader Type,0--USB,1--proUSB
        public static int st = 0;       
        public static string bufCard;

        [DllImport("proRFL.DLL")]
        public static extern int ReadCard(byte fUSB, string Buffer); 
        
        [DllImport("proRFL.DLL")]
        public static extern int CardErase(byte fUSB, int dlsCoID, string cardHexStr);
    } // end Unit1
}

FranzBe

Вы передаете пустую строку в параметр buffer функции ReadCard (). Вы уверены, кто выделяет память для строки? Функция неуправляемой библиотеки Dll? Я бы попытался присвоить некоторое пространство переменной 'bufCard' перед переходом к функции ReadCard ().

1 Ответов

Рейтинг:
12

KarstenK

Франц Б прав: вы должны предоставить некоторую память для этой функции. Проблема реализации заключается в том, что ваш класс Unit1 не читается для работы. Я бы изменил или добавил эти детали.

public class Unit1
   {
       //public static TForm1 Form1 = null; // remove
       private byte flagUSB = 0;
       // Reader Type,0--USB,1--proUSB
       //public static int st = 0; // remove
       private byte[] bufCard;
       //constructor
       public Unit1(int buffSize, int flag)
       {
          bufCard = new byte[buffSize];//allocate the needed buffer
          flagUSB = flag;
       }
      public GetBuffer()
       {
          return bufCard;// buffer access
       }
       public int ReadBuffer()
       {
          return ReadCard(flagUSB, bufCard);//read the needed buffer
       }
Это какой-то более четкий код. Надеюсь, это сработает ;-)