Входная строка не обновляется с помощью dllImport с использованием в c #

1

ВСТУПЛЕНИЕ

Исходный рабочий код находится в VB6... Но, когда я пытаюсь преобразовать и использовать в С#, он не работает

ПРОБЛЕМА

Проблема в этой строке в С#

Результат = Iso14443Anticoll (HANDLE, 147, Uid, MultiTag, 0)

Variable Uid не содержит (обновляет) любое значение, в отличие от VB6, которое он делает

ИСПОЛЬЗОВАНИЕ DLL IN VB6

Declare Function OpenCommPort Lib "MR705API.dll" Alias "?OpenCommPort@@YGHPADPAPAX@Z" (ByVal PortName As String, ByRef hCom As Long) As Long
Declare Function CloseCommPort Lib "MR705API.dll" Alias "?CloseCommPort@@YGHPAX@Z" (ByVal hCom As Long) As Long
Declare Function SetLED Lib "MR705API.dll" Alias "?SetLED@@YGHPAXEE@Z" (ByVal hCom As Long, ByVal Led As Byte, ByVal Addr As Byte) As Long
Declare Function ActiveBuzzer Lib "MR705API.dll" Alias "?ActiveBuzzer@@YGHPAXEE@Z" (ByVal hCom As Long, ByVal DelayTime As Byte, ByVal Addr As Byte) As Long
Declare Function Iso14443Reqa Lib "MR705API.dll" Alias "?Iso14443Reqa@@YGHPAXEPAEE@Z" (ByVal hCom As Long, ByVal ReqAMode As Byte, ByVal ATQ As String, ByVal Addr As Byte) As Long
Declare Function Iso14443Anticoll Lib "MR705API.dll" Alias "?Iso14443Anticoll@@YGHPAXEPAE1E@Z" (ByVal hCom As Long, ByVal AnticollMode As Byte, ByVal Uid As String, ByVal MultiTag As String, ByVal Addr As Byte) As Long

ФУНКЦИОНАЛЬНЫЙ ВЫЗОВ В VB6

    Dim HANDLE As Long
    Dim Result As Long
    Dim ATQ As String * 10
    Dim Uid As String * 10
    Dim MultiTag As String * 10
    Dim ID As String
    Dim Temp As String

    Result = OpenCommPort(COMPORT, HANDLE)
    If Result = 0 Then
        Result = Iso14443Reqa(HANDLE, 82, ATQ, 0)
        If Result = 0 Then
            Result = SetLED(HANDLE, 1, 0)
            Result = Iso14443Anticoll(HANDLE, 147, Uid, MultiTag, 0)
            MsgBox Uid //there is value contained after input in Iso14443Anticoll()
            ...
            ...
    End Sub

ИСПОЛЬЗОВАНИЕ DLL IN С#

[DllImport ("MR705API.dll",
EntryPoint="?OpenCommPort@@YGHPADPAPAX@Z")]
public static extern int OpenCommPort(string portName, ref int hCom); 

[DllImport ("MR705API.dll",
EntryPoint="?CloseCommPort@@YGHPAX@Z")]
public static extern int CloseCommPort(int hCom);

[DllImport ("MR705API.dll",
EntryPoint="?SetLED@@YGHPAXEE@Z")]
public static extern int SetLED(int hCom, Byte Led , Byte Addr);

[DllImport ("MR705API.dll",
EntryPoint="?ActiveBuzzer@@YGHPAXEE@Z")]
public static extern int ActiveBuzzer (int hcom, Byte DelayTime, Byte Addr);

[DllImport ("MR705API.dll",
EntryPoint="?Iso14443Reqa@@YGHPAXEPAEE@Z")]
public static extern int Iso14443Reqa (int hcom, Byte ReqAMode, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString ATQ, Byte Addr);

[DllImport ("MR705API.dll",
EntryPoint="?Iso14443Anticoll@@YGHPAXEPAE1E@Z"]
public static extern int Iso14443Anticoll (int hcom, Byte AnticollMode, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString Uid, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString MultiTag, Byte Addr);

ФУНКЦИОНАЛЬНЫЙ ВЫЗОВ С#

    int HANDLE = 0;
    int Result = 0;
    Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString Uid = new FixedLengthString(10);
    Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString ATQ = new FixedLengthString(10);
    Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString MultiTag = new FixedLengthString(10);
    string ID;
    string Temp;
    string IDNow;

    Result = OpenCommPort("COM9", ref HANDLE);              
    if (Result == 0) {
        Result = Iso14443Reqa(HANDLE, 82, ATQ, 0);
        if (Result == 0) {
            Result = SetLED(HANDLE, 1, 0);
            Result = Iso14443Anticoll(HANDLE, 147, Uid, MultiTag, 0);
            Debug.WriteLine("Uid :: " + Uid);
            //There is no any update value just contained length = 10
            ....
            ....

ДОПОЛНИТЕЛЬНЫЙ

Я уже искал некоторую информацию для конвертации из VB6 в С#, эта проблема была решена

  1. long в эквиваленте vb6 int int С#
  2. Точка входа должна быть настроена так, чтобы исключить System.EntryPointNotFoundException
  3. неправильная входная сигнатура для функции dll может привести к System.AccessViolationException
  • 0
    Почему это FixedLengthString а не просто string ?
  • 0
    @DavidG на самом деле, я не знаю, в чем причина моей проблемы сейчас, поэтому я стараюсь сначала сделать мой код почти старой версии от vb6, поэтому я использую его
Показать ещё 8 комментариев
Теги:
vb6
dllimport

1 ответ

1
Лучший ответ

СПЕЦИАЛЬНОЕ СПАСИБО..

OKAY... Прежде всего, я хочу поблагодарить @DavidG за руководство мной

ОТВЕТИТЬ СВОЙ СОБСТВЕННЫЙ ВОПРОС...

Строка ввода не обновляется из-за неправильной подписи DllImport.

Я идентифицировал свою DLL, используя Dependencies Walker, как упоминание в этой LINK

Инструмент предоставляет имя и подпись каждой функции в неуправляемом.dll

Изображение 174551

Итак, у меня есть замена некоторой сигнатуры функции.

НАПРИМЕР

Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString to byte []

строка в байт []

Байт в байт

long to int

ЗДЕСЬ ОБНОВЛЕННЫЙ ОТВЕТ..

        [DllImport ("MR705API.dll",
        EntryPoint="?OpenCommPort@@YGHPADPAPAX@Z")]
        public static extern int OpenCommPort(string portName, ref IntPtr hCom); 

        [DllImport ("MR705API.dll",
        EntryPoint="?CloseCommPort@@YGHPAX@Z")]
        public static extern int CloseCommPort(IntPtr hCom);

        [DllImport ("MR705API.dll",
        EntryPoint="?SetLED@@YGHPAXEE@Z")]
        public static extern int SetLED(IntPtr hCom, byte Led , byte Addr);

        [DllImport ("MR705API.dll",
        EntryPoint="?ActiveBuzzer@@YGHPAXEE@Z")]
        public static extern int ActiveBuzzer (IntPtr hcom, byte DelayTime, byte Addr);

        [DllImport ("MR705API.dll",
        EntryPoint="?Iso14443Reqa@@YGHPAXEPAEE@Z")]
        public static extern int Iso14443Reqa (IntPtr hcom, byte ReqAMode, byte[] ATQ, byte Addr);

        [DllImport ("MR705API.dll",
        EntryPoint="?Iso14443Anticoll@@YGHPAXEPAE1E@Z")]
        public static extern int Iso14443Anticoll (IntPtr hcom, byte AnticollMode,[InAttribute] byte[] Uid, byte[] MultiTag, byte Addr);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню