Я сделал проект для своего устройства считывания карт ATM в проекте C ++, и он работает нормально. Когда я пытаюсь использовать один и тот же заголовочный файл и DLL в проекте C#, я получаю эту ошибку:
System.ExecutionEngineException: 'Exception of type 'System.ExecutionEngineException' was thrown.'
C ++ Code
HANDLE port = CommOpenWithBaut(1, 9600);
if (port == 0)
{
cerr << "Cannot open device";
return -1;
}
unsigned char PewSt = 0;
unsigned char CardType = 0;
unsigned char CardSt = 0;
unsigned char PowerSt = 0;
int rc = CarderCheckSt(port, PewSt, CardType, CardSt, PowerSt);
//cout << "This is the card Status: " << CarderCheckSt << endl;
int bufferSize = 128;
BYTE buffer[128];
int bytesRead = MagRead(port, buffer, bufferSize);
string text(buffer, buffer + bufferSize);
cerr << "Card Details : " <<text;
CommClose(port);
Порт - это ручка для настройки функции порта CommOpenWithBaut()
. CarderCheckSt()
проверяет состояние считывателя карт банкомата. MagRead()
имеет данные буфера, считанные с карты, а text()
преобразует этот буфер в код ASCII. CommClose()
закрывает порт после завершения.
C# Код
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommOpenWithBaut")]
public static extern Handle CommOpenWithBaut(uint nPort, uint _data);
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommClose")]
public static extern int CommClose(Handle hComHandle);
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
public static extern int MagRead(Handle hComHandle, Byte[] MagData, int lenth);
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
public static extern int CarderCheckSt(Handle hComHandle, char PewSt, char CardType, char CardSt, char PowerSt);
public Form1()
{
InitializeComponent();
}
public void button1_Click(object sender, EventArgs e)
{
Handle port = CommOpenWithBaut(1, 9600);
Byte[] MagData = {128};
int lenth = 128;
MagRead(port, MagData, lenth);
char PewSt = '0';
char CardType = '0';
char CardSt = '0';
char PowerSt = '0';
CarderCheckSt(port, PewSt, CardType, CardSt, PowerSt);
MessageBox.Show($"CarderCheckSt");
CommClose(port);
}
Я использовал DllImport
, чтобы импортировать те же 4 функции из DLL, которые я использовал в предыдущем проекте. Я добавил кнопку при нажатии, она должна делать то же самое.
Это заголовочный файл
#include <iostream>
#include <windows.h>
#ifdef ModuleV188_EXPORTS
#define ModuleV188_API extern "C" __declspec(dllexport)
#else
#define ModuleV188_API extern "C" __declspec(dllimport)
#endif
extern "C" ModuleV188_API HANDLE CommOpenWithBaut(UINT nPort, UINT _data);
extern "C" ModuleV188_API int CommClose(HANDLE hComHandle);
extern "C" ModuleV188_API int CarderCheckSt(HANDLE hComHandle, unsigned char& PewSt, unsigned char& CardType, unsigned char& CardSt, unsigned char& PowerSt);
extern "C" ModuleV188_API int MagRead(HANDLE hComHandle, BYTE* MagData, int& lenth);
Кроме того, когда программа связывается со считывателем карт банкомата, она записывает в журнал. Байты, полученные в журнале для обеих программ.
для С ++ УСПЕШНОЕ ЧТЕНИЕ:
18:58:37 COM1´ٍ؟ھ³ة¹¦
18:58:38 ========> 02000231440376
18:58:39 <======== 0200043144303103
18:58:39 <======== 020004314430310371
18:58:39 ========> 0200023B35030D
18:58:39 <======== 0200773B35594234
в журнале C#:
10:16:37 COM1´ٍ؟ھ³ة¹¦
FIX
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommOpenWithBaut")]
public static extern IntPtr CommOpenWithBaut(uint nPort, uint _data);
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommClose")]
public static extern int CommClose(IntPtr hComHandle);
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
public static extern int MagRead(IntPtr hComHandle, byte[] MagData, ref byte lenth);
[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
public static extern int CarderCheckSt(IntPtr hComHandle, ref byte PewSt, ref byte CardType, ref byte CardSt, ref byte PowerSt);
public Form1()
{
InitializeComponent();
}
public void button1_Click(object sender, EventArgs e)
{
IntPtr port = CommOpenWithBaut(1, 9600);
Byte[] MagData = {128};
byte lenth = 128;
byte PewSt = 0 ;
byte CardType = 0;
byte CardSt = 0;
byte PowerSt = 0;
// CarderCheckSt(port, ref PewSt, ref CardType, ref CardSt, ref PowerSt);
MagRead(port, MagData, ref lenth);
MessageBox.Show($"rc");
MessageBox.Show($"read");
CommClose(port);
}