fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
阅读:1561回复:5

请教:ce5.0下,流驱动的多次加载问题

楼主#
更多 发布于:2008-06-02 10:18
请教下 : 在ce4.2,5.0下,假设驱动A,B,C 对应的都是同一个流驱动文件comon.dll, 那么当应用程序打开A,B,C时,会不会分别都会调用一次common.dll的 XXX_Init()呢? 因为流驱动都是加载到device.exe的进程空间的,相同的dll应该是只加载一次吧?所以我觉得应该是不会每次调用xxx_init()才对。
    由于当流驱动加载时,在调用xxx_init()之后,xxx_open是会被自动调用一次的, 因此我将对xxx_open的调用进行了计数,发现加载完A,B,C之后,xxx_open的引用计数是3,这应该说明,加载A,B,C三个驱动时,每次都有调用了xxx_init() ,不知道这个该怎么解释呢?

问题:1, 在这种A,B,C对应同一个流驱动的情况下, 系统加载了几次common.dll呢,即xxx_init,xxx_open被调用了几次呢?
      2,如果在common.dll里面有全局变量,那么这个全局变量在A,B,C之间是不是共享的?

ce5.0的进程的地址空间我记得是共享的,所以一下有点想不通了,大家帮忙解惑一下,呵呵。
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
沙发#
发布于:2008-06-02 11:14
您好. 您可能说的是串口驱动.

加载了3次. a , b, c 指向同一个driver.dll, 但是device.exe加载不是依据dll, 而是依据注册表, 注册表里面a, b, c为3个驱动,尽管他们指向同一个dll. 每次加载时候, 都会执行***_Init,根据输入的参数来判断a,b,c, 输入的参数是不同的注册表路径. 返回TRUE则加载成功. 您说的***_Open在加载阶段是不会执行的, ***_Open的执行不是加载造成的, 我没有记错的话应该是电源管理open, 随后立即close.
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-06-02 17:14
high说对了,确实是串口驱动。我想了想,调用的应该是同一个dll的xxx_init函数,所以里面的变量什么的应该都是共享的,呵呵。
不知道楼上的对虚拟驱动有没有研究,手机模块通过一个gsm0710复用协议,将一个物理串口虚拟成5,6,7多个虚拟串口,每个串口分别对应不同的模块。不过我不明白的是,我们应用程序打开了虚拟串口5,那么手机模块那里又如何知道该将哪一个模块对应这个虚拟串口5呢?还是gsm0710协议里面有规定了?不过目前我还没有在协议里面找到这方面的说明,困惑中。。。
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
地板#
发布于:2008-06-02 20:10
我使用RegisterDevice虚拟过串口.

 应用指定了*5*, open后获得了句柄, 底层模块自然有了判断的依据了.
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-06-03 10:41
但是手机模块的程序不是我们写的,因此虚拟串口和手机模块里面的几个串口模块的对应关系我们应该是不能控制的?  我现在知道如何利用复用协议虚拟出若干个串口,不过却不知道怎么将虚拟出来的串口和手机模块里面的一一对应起来。 比如我虚拟出串口5,6,7,分别对应手机模块里面的串口模块a,b,c,但是如果我想这样对应5->c ,6->a ,7>b,那么该如何做呢?知道的兄弟帮忙解答下,我也再去研究研究,呵呵。
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-06-03 17:06
弄明白了,手机模块就是一个串口。 之所以要虚拟出几个串口是为了能让手机模块同时处理不同的业务,这样就不至于在一项业务需要阻塞操作时,导致其他业务也无法进行。
游客

返回顶部