佚名通过本文主要向大家介绍了js调用ocx,java调用ocx控件,c#调用ocx,java调用ocx,js调用ocx控件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 调用OCX的问题,500分送上
描述:
解决方案1:
这个问题我仔细分析了一下,首先VC6建立的那个dlg程序是单线程的,而3fPMComm.ocx是windowless的即没有窗口,那么这个控件又如何保证每个1秒就向串口写数据呢。既然是单线程的,那么最大的可能就是处理线程的WM_TIME消息,或者是用异步过程的回调函数了(即APC过程调用,这实际是内核创建了一个定时器,时间到了以后去调用用户线程中的回调函数,这必须使线程处于警告状态)。
既然VC2005下能运行,我先在VC05下试验了一下,我在PreTranslateMessage(MSG* pMsg) 中处理WM_TIME消息,并设下断点,果然和我猜想的一致,它就是处理WM_TIME的,然后我跟踪它的消息路由,没有调用特殊的窗口函数,...最后直接通过
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
发送出去了,而究竟Dispatch给谁了,这个不要紧,最重要的是我发现了这个被发送的pMsg有一些特征,
这个message的hwnd是0,lParam = 0x10001dd0是个定数,我于是感到很高兴。赶紧在VC6下做了试验,
处理WM_TIME消息,然后观察pMsg的数据,lParam果然没变,修改之,然后通过反复试验,发现当lp=0x10001dd0时,lp=1时,才能往串口发数据,事情虽然解决了,但其中要去思考的东西太多了
解决方案2:
描述:
3fPMComm.ocx是一个第三方提供的软件, 功能是打开串口,并发送和接受数据。
使用vb,delphi , vc自带的ActivecX Control Test Container 调用该组件,都能达到预期效果,
调用ConnectPM(1) , 用AccessPort(串口监控软件)可以发现:
每隔一秒左右,发送18字节长度的数据包。
但用vc写一个测试程序,调用ConnectPM(1) , 用AccessPort(串口监控软件)发现:
没有发送数据包(也就是不发送18字节的数据包)。
弄3天了,都不知道为什么? 希望高手帮解决,提供解决方案, 或者修改代码,只要能解决,不胜感激,另500份送上
组件下载地址:
http://d.download.csdn.net/down/2234137/caitian6
解决方案1:
我用下面的方法在VC6上通过。
BOOL CTestOcx1Dlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_TIMER)
{
pMsg->hwnd = 0;
pMsg->wParam = 1;
pMsg->lParam = 0x10001dd0;
}
return CDialog::PreTranslateMessage(pMsg);
}
这个问题我仔细分析了一下,首先VC6建立的那个dlg程序是单线程的,而3fPMComm.ocx是windowless的即没有窗口,那么这个控件又如何保证每个1秒就向串口写数据呢。既然是单线程的,那么最大的可能就是处理线程的WM_TIME消息,或者是用异步过程的回调函数了(即APC过程调用,这实际是内核创建了一个定时器,时间到了以后去调用用户线程中的回调函数,这必须使线程处于警告状态)。
既然VC2005下能运行,我先在VC05下试验了一下,我在PreTranslateMessage(MSG* pMsg) 中处理WM_TIME消息,并设下断点,果然和我猜想的一致,它就是处理WM_TIME的,然后我跟踪它的消息路由,没有调用特殊的窗口函数,...最后直接通过
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
发送出去了,而究竟Dispatch给谁了,这个不要紧,最重要的是我发现了这个被发送的pMsg有一些特征,
这个message的hwnd是0,lParam = 0x10001dd0是个定数,我于是感到很高兴。赶紧在VC6下做了试验,
处理WM_TIME消息,然后观察pMsg的数据,lParam果然没变,修改之,然后通过反复试验,发现当lp=0x10001dd0时,lp=1时,才能往串口发数据,事情虽然解决了,但其中要去思考的东西太多了
解决方案2:
邮件已发,LZ换台机试试