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);被异步执行了
展开
 我来答
阳光的雷咩咩
2016-12-16 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7866万
展开全部
作为临时解决办法,可以试试进程间通信,或者文件等作为语言间中转。
追问
这样解决感觉不是很好,而且我的本意是不想修改ocx控件中的内容的,因为除了winform调用外,web程序也调用这个ocx,感谢你的回答。
追答
在.net里用ocx也不是什么好设计。该全部重写。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式