kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1956回复:19

怎样可以实现应用程序可以随时读取驱动中的数据?

楼主#
更多 发布于:2005-03-30 10:34
驱动不停的写数,随时从应用程序读数。好像用变量不行。一到读数程序就重启。可是用互斥在windows程序下好像也不行。可是在DOS下就行。用共享事件也不行,不能随时读数,是驱动通知应用,而不是应用随时读取。请大哥们帮帮忙小妹,领导逼得急!!!!!
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-30 10:43
请大哥们帮帮忙小妹

真的假的???
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-03-30 12:21
驱动不停的写数,随时从应用程序读数。好像用变量不行。一到读数程序就重启。可是用互斥在windows程序下好像也不行。可是在DOS下就行。用共享事件也不行,不能随时读数,是驱动通知应用,而不是应用随时读取。请大哥们帮帮忙小妹,领导逼得急!!!!!

那是读处理的有问题呀】
---内核开发合作或提供基础技术服务QQ:22863668 ---
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2005-03-30 15:53
用共享内存.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-30 16:15
用共享内存.

但要处理好同步问题
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-31 12:33
恩。共享内存应该可以,注意同步了。。应该就是加个自旋锁吧!
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-01 14:47
用的就是共享内存亚,用的是事件。
我的应用程序在dos下作的能正常取数。
可我现在做成windows的dll函数就不行了,和在DOs
下的流程一模一样,区别就是一个是dos下的,一个是dll,都是用的线程加同步事件,可是不知道为什么,等同步事件到来时去调用deviceiocontrol时发现打开设备的句柄便成了0xfffffff,不知道为什么做了几次都是这样的?可是在dos下却没有这个问题呀?




当然是小妹了亚!!!
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-04-01 14:51
做了这么久的驱动,发现自己怎么真的不是做驱动的料,真不知道该做什么,不想做技术了,大家都有什么意见?
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-04-01 14:54
发现做驱动真的需要很深的功底,大家介绍介绍要想做一位驱动高手,该看些什么,怎么做提高的比较快?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2005-04-01 15:49
发现做驱动真的需要很深的功底,大家介绍介绍要想做一位驱动高手,该看些什么,怎么做提高的比较快?
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-04-01 16:53
用的就是共享内存亚,用的是事件。
我的应用程序在dos下作的能正常取数。
可我现在做成windows的dll函数就不行了,和在DOs
下的流程一模一样,区别就是一个是dos下的,一个是dll,都是用的线程加同步事件,可是不知道为什么,等同步事件到来时去调用deviceiocontrol时发现打开设备的句柄便成了0xfffffff,不知道为什么做了几次都是这样的?可是在dos下却没有这个问题呀?




当然是小妹了亚!!!
 

这种情况,就得上调试器了,用softice跟踪,看那一步打开设备的句柄便成了0xfffffff.小妹做驱动,我感觉太少了,看看驱网聚会照片,和我们大学时一样,仅有一个女生,我们称为\"万金\",大家都出把力
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-04-06 14:18
各位大哥
我能在dll下创建一个线程么,可是不知道为什么在线程运行过程中,我的硬件的句柄就变成ffffff.好像被关闭了似的,可是我在程序和dll没有关闭硬件呀????好像就莫名其妙的关闭了似的。

bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-04-06 16:15
各位大哥
我能在dll下创建一个线程么,可是不知道为什么在线程运行过程中,我的硬件的句柄就变成ffffff.好像被关闭了似的,可是我在程序和dll没有关闭硬件呀????好像就莫名其妙的关闭了似的。

 

当然可以了,而且创建的线程与你的进程共享句柄,把你的代码铁上来
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-04-07 14:06
我在线程创建时把硬件句柄传了过来,硬件句柄是传了过来,可是数据还是无法传到应用程序,不知道你们说的共享内存和同步,是不是和我理解的一样,我在驱动中分配的内存,然后和通过事件将地址传给dll,在dll中将程序传给应用程序。
我的应用程序和dll的代码如下,请大家帮我看看是不是我流程有问题:
dll.cpp
MY9054DLL_API  void Set_Start(unsigned int iRate,unsigned int iCount)      
{  
m_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

if(m_hEvent==NULL)
{
  printf(\"Event not creating\");
}
if (!DeviceIoControl(hDevice,
P9054_IOCTL_803,
&m_hEvent,
sizeof(m_hEvent),
NULL,
0,
&nret,
NULL)
  )                          //共享事件


if (!DeviceIoControl(hDevice,
P9054_IOCTL_800,
&uInRate,
sizeof(uInRate),
NULL,
0,
&nret,
NULL)
)
 ::MessageBox(NULL,\"ok\",\"800\",MB_OK);   //开始采集数据     return false;

BufferSize=iCount*sizeof(LONG);
    
    
if((CreateThread(NULL,0,GetPoint,(LPVOID)hDevice,0,&dwordId))==NULL)
{
       printf(\"ERROR: CreateThread returns %0x.\", GetLastError());
}


// return true;
}


DWORD WINAPI GetPoint(LPVOID param)
{
   while(1)
  {
    if(::WaitForSingleObject(m_hEvent,0)==WAIT_OBJECT_0)
        res=DeviceIoControl(DeviceHandle,
P9054_IOCTL_804,
NULL,
0,
&BufferData,
BufferSize,
&nret,
NULL);
Error=GetLastError();
     if(res==FALSE)
        ::MessageBox(NULL,\"ok\",\"Res1\",MB_OK);
     Save_Buffer.WriteData((void *)bufferData,BufferSize);
}//这是我自己定义的一个环形数据结构,将数据从dll中拷到环形数据结构
}    
   return 0;



应用程序代码:

void CMy9054DlgDlg::OnButton1()
{  
Set_Start(uRate,uCount);

SetTimer(1,50,NULL);
 
// TODO: Add your control notification handler code here

}

void CMy9054DlgDlg::OnTimer(UINT nIDEvent)
{
    switch(nIDEvent)
{
  case 1:
  Get_Data(databuffer,uCount);
   
  break;
            }

// TODO: Add your message handler code here and/or call default

CDialog::OnTimer(nIDEvent);
}

void CMy9054DlgDlg::OnStop()
{
          KillTimer(1);

Set_Stop();

}
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-04-07 14:50
我在线程创建时把硬件句柄传了过来,硬件句柄是传了过来,可是数据还是无法传到应用程序,不知道你们说的共享内存和同步,是不是和我理解的一样,我在驱动中分配的内存,然后和通过事件将地址传给dll,在dll中将程序传给应用程序。
我的应用程序和dll的代码如下,请大家帮我看看是不是我流程有问题:
dll.cpp
MY9054DLL_API  void Set_Start(unsigned int iRate,unsigned int iCount)      
{  
m_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

if(m_hEvent==NULL)
{
  printf(\"Event not creating\");
}
if (!DeviceIoControl(hDevice,
P9054_IOCTL_803,
&m_hEvent,
sizeof(m_hEvent),
NULL,
0,
&nret,
NULL)
  )                          //共享事件


if (!DeviceIoControl(hDevice,
P9054_IOCTL_800,
&uInRate,
sizeof(uInRate),
NULL,
0,
&nret,
NULL)
)
 ::MessageBox(NULL,\"ok\",\"800\",MB_OK);   //开始采集数据     return false;

BufferSize=iCount*sizeof(LONG);
    
    
if((CreateThread(NULL,0,GetPoint,(LPVOID)hDevice,0,&dwordId))==NULL)
{
       printf(\"ERROR: CreateThread returns %0x.\", GetLastError());
}


// return true;
}


DWORD WINAPI GetPoint(LPVOID param)
{
   while(1)
  {
    if(::WaitForSingleObject(m_hEvent,0)==WAIT_OBJECT_0)
        res=DeviceIoControl(DeviceHandle,
P9054_IOCTL_804,
NULL,
0,
&BufferData,
BufferSize,
&nret,
NULL);
Error=GetLastError();
     if(res==FALSE)
        ::MessageBox(NULL,\"ok\",\"Res1\",MB_OK);
     Save_Buffer.WriteData((void *)bufferData,BufferSize);
}//这是我自己定义的一个环形数据结构,将数据从dll中拷到环形数据结构
}    
   return 0;



应用程序代码:

void CMy9054DlgDlg::OnButton1()
{  
Set_Start(uRate,uCount);

SetTimer(1,50,NULL);
 
// TODO: Add your control notification handler code here

}

void CMy9054DlgDlg::OnTimer(UINT nIDEvent)
{
    switch(nIDEvent)
{
  case 1:
  Get_Data(databuffer,uCount);
   
  break;
            }

// TODO: Add your message handler code here and/or call default

CDialog::OnTimer(nIDEvent);
}

void CMy9054DlgDlg::OnStop()
{
          KillTimer(1);

Set_Stop();

}

不能通过事件传地址,那个地址是核心地址空间的,用户程序不能适用,是需要映射到用户空间才能用
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-04-08 13:05
我没有用事件传地址亚,我只是在驱动和dll间共享了事件,在事件到来时,在映射地址亚,能把你认为错的地方标出来么??
谢谢!!!
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-04-08 15:00
 res=DeviceIoControl(DeviceHandle,
P9054_IOCTL_804,
NULL,
0,
&BufferData,
BufferSize,
&nret,
NULL);\'
中这个DeviceHandle是哪里定义的,前面都是用的hDevice,然后如果这个是笔误的话,请检查一下驱动中对P9054_IOCTL_804的处理
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-04-11 08:51
是这样的因为硬件句柄找不到,我就让他在线程创建的时候传了过来,现在能就能得到句柄了。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-04-11 09:15
是这样的因为硬件句柄找不到,我就让他在线程创建的时候传了过来,现在能就能得到句柄了。

这么说,现在问题解决了,嘿嘿
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-04-12 08:46
是呀,目前看来是,谢谢呀!!!
游客

返回顶部