INTRO
The original working code is in VB6... But, when I try to convert and use in c# it doesn't work
PROBLEM
The problem is on this line in c#
Result = Iso14443Anticoll(HANDLE, 147, Uid, MultiTag, 0)
Variable Uid
doesn't contain (update) any value unlike VB6 it does
USING 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
FUNCTION CALL IN 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
USING DLL IN C#
[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);
FUNCTION CALL IN C#
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
....
....
ADDITIONAL
I already search some information to convert from VB6 to C# , These Problem was already resolved
- long in vb6 equivalent int int c#
- Entry Point need to be set to prevent
System.EntryPointNotFoundException
- wrong input signature for dll function may cause
System.AccessViolationException