c# winform 调用ocx中方法执行顺序问题
程序基本信息:我的程序是c#winform程序,程序中需要调用磁卡读卡器的ocx驱动方法。现状描述:现在已经实现了调用ocx中的方法,也有返回值,但是每次返回值都是默认返...
程序基本信息:
我的程序是c# winform程序,程序中需要调用磁卡读卡器的ocx驱动方法。
现状描述:
现在已经实现了调用ocx中的方法,也有返回值,但是每次返回值都是默认返回值。
程序原理:
1、程序调用ocx:ocx是C++写的ocx,ocx中有读卡接口方法,成功返回0,否则为失败。成功或失败时都会触发响应的事件,后面会有说明。我注册ocx后将ocx控件添加到工具箱中,然后将ocx控件拖拽到需要调用的Form中进行调用。
2、ocx描述:ocx也是我自己写的,有源码,后面会贴出。ocx方法中需要调用另外的Dll文件中的方法(感觉问题就出在这里)。
问题描述:
现在问题是这样,虽然成功的调用到了ocx中的方法,但是执行速度很快,马上返回执行结果,并且触发了响应的ocx中的方法。但是实际效果应该是调用方法(读磁卡)后程序需要等待操作人进行刷卡操作,刷卡成功后程序继续向下执行。
c#代码:
//磁卡
private void button1_Click(object sender, EventArgs e)
{
try
{
//获取设备超时时间
string timeOut = Global.GetConfigAppSetting("DeviceTimeOut");
short iTimeOut = 0;
if (!short.TryParse(timeOut, out iTimeOut))
{
iTimeOut = 20;
}
//读卡
int nResult = this.CardDevice.ReadTracks(iTimeOut);
if (nResult == 0)
{
LogManager.OperateLogHelper.WriteOperationLog("读卡成功!");
MessageBox.Show(this.CardDevice.strTrack2);
MessageBox.Show(this.CardDevice.strTrack3);
}
else
{
MessageBox.Show("操作失败!");
}
}
catch (Exception ex)
{
MessageBox.Show("获取设备驱动失败!");
}
}
ocx代码:
short CCardDeviceCtrl::ReadTracks(short Timeout)
{
// TODO: Add your dispatch handler code here
m_strTrace.Format("ReadTracks Start");
m_log.WriteTraceLog(m_strTrace);
int nResult = 0;
char track2[256];
char track3[256];
memset(track2,0,256);
memset(track3,0,256);
//调用DLL中的方法进行读卡操作。
//问题应该在这里,代码并没有在此等待操作人刷卡操作,而是直接往下执行并返回结果。
nResult = m_lPXTY_MsrRead(m_Port,m_BPPort,m_Baudrate,23,0,track2,track3,Timeout);
if(nResult >= 0)
{
m_strTrack2 = track2;
m_strTrack3 = track3;
}
else
{
m_strTrack2 = "";
m_strTrack3 = "";
}
m_strTrace.Format("ReadTracks Result=%d end",nResult);
m_log.WriteTraceLog(m_strTrace);
if(nResult == 0)
{
FireReadComplete();
}
else if(nResult == -203 || nResult == -206)
{
FireTimeOut();
}
else
{
FireDeviceError();
}
return nResult;
}
感觉nResult = m_lPXTY_MsrRead(m_Port,m_BPPort,m_Baudrate,23,0,track2,track3,Timeout);被异步执行了 展开
我的程序是c# winform程序,程序中需要调用磁卡读卡器的ocx驱动方法。
现状描述:
现在已经实现了调用ocx中的方法,也有返回值,但是每次返回值都是默认返回值。
程序原理:
1、程序调用ocx:ocx是C++写的ocx,ocx中有读卡接口方法,成功返回0,否则为失败。成功或失败时都会触发响应的事件,后面会有说明。我注册ocx后将ocx控件添加到工具箱中,然后将ocx控件拖拽到需要调用的Form中进行调用。
2、ocx描述:ocx也是我自己写的,有源码,后面会贴出。ocx方法中需要调用另外的Dll文件中的方法(感觉问题就出在这里)。
问题描述:
现在问题是这样,虽然成功的调用到了ocx中的方法,但是执行速度很快,马上返回执行结果,并且触发了响应的ocx中的方法。但是实际效果应该是调用方法(读磁卡)后程序需要等待操作人进行刷卡操作,刷卡成功后程序继续向下执行。
c#代码:
//磁卡
private void button1_Click(object sender, EventArgs e)
{
try
{
//获取设备超时时间
string timeOut = Global.GetConfigAppSetting("DeviceTimeOut");
short iTimeOut = 0;
if (!short.TryParse(timeOut, out iTimeOut))
{
iTimeOut = 20;
}
//读卡
int nResult = this.CardDevice.ReadTracks(iTimeOut);
if (nResult == 0)
{
LogManager.OperateLogHelper.WriteOperationLog("读卡成功!");
MessageBox.Show(this.CardDevice.strTrack2);
MessageBox.Show(this.CardDevice.strTrack3);
}
else
{
MessageBox.Show("操作失败!");
}
}
catch (Exception ex)
{
MessageBox.Show("获取设备驱动失败!");
}
}
ocx代码:
short CCardDeviceCtrl::ReadTracks(short Timeout)
{
// TODO: Add your dispatch handler code here
m_strTrace.Format("ReadTracks Start");
m_log.WriteTraceLog(m_strTrace);
int nResult = 0;
char track2[256];
char track3[256];
memset(track2,0,256);
memset(track3,0,256);
//调用DLL中的方法进行读卡操作。
//问题应该在这里,代码并没有在此等待操作人刷卡操作,而是直接往下执行并返回结果。
nResult = m_lPXTY_MsrRead(m_Port,m_BPPort,m_Baudrate,23,0,track2,track3,Timeout);
if(nResult >= 0)
{
m_strTrack2 = track2;
m_strTrack3 = track3;
}
else
{
m_strTrack2 = "";
m_strTrack3 = "";
}
m_strTrace.Format("ReadTracks Result=%d end",nResult);
m_log.WriteTraceLog(m_strTrace);
if(nResult == 0)
{
FireReadComplete();
}
else if(nResult == -203 || nResult == -206)
{
FireTimeOut();
}
else
{
FireDeviceError();
}
return nResult;
}
感觉nResult = m_lPXTY_MsrRead(m_Port,m_BPPort,m_Baudrate,23,0,track2,track3,Timeout);被异步执行了 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询