关于并发访问串口的问题

skyzxg 2005-12-08 08:42:52
一个DLL,将多次被不同应用加载,第一次时调用打开COM,按一般的情况第二次打开端口已被占用
现在希望第二次调用可以直接共享前一次的COM控制,进行正常的COM通讯
当最后一个DLL比卸载时COM资源才被释放

请问怎么做比较好,谢谢
...全文
232 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyzxg 2005-12-09
  • 打赏
  • 举报
回复
其实说白了,就是理论我了解,具体调用我还不是很明白
有个小例子再好不过
skyzxg 2005-12-09
  • 打赏
  • 举报
回复
现在我知道的是,A可以复制出来该句柄值D,按理进程B也可以调用,可是如何调用我不明白
用共享内存共享将复制句柄的方法我试过了,不行
不过我是直接将该HANDLE handle共享的,并得到值后直接调用,不知是否这里出了问题

xiaoqiqixiao 2005-12-09
  • 打赏
  • 举报
回复
楼主千万不要钻牛角尖啊,你通过DuplicateHandle得到的这个值就是对应于你的B进程的句柄值,所以B进程只要知道了这个值就可以调用了,要不还用DuplicateHandle干嘛

之所以要用DuplicateHandle是因为A中的句柄值只能在A中访问相对应的内核量
现在用了DuplicateHandel已经将A中的句柄值转换成了该内核量在B中的句柄值,当然可以在B中访问对应的内核量了

你的这个句柄值变量放在哪很重要吗?什么叫共享内存段,就是所有进程都能访问到的
皮皮鲁 2005-12-09
  • 打赏
  • 举报
回复
楼上,前面已经有人说过了,用DuplicateHandle
windows核心编程关于这个函数讲的很清楚
自己再去看看
skyzxg 2005-12-09
  • 打赏
  • 举报
回复
又说回来了,共享内存段得到的只是一个值,并不能真正调用
如何才能让B真正调用D呢
那书上是说过,不过说的很粗
xiaoqiqixiao 2005-12-09
  • 打赏
  • 举报
回复
内核对象只有内核才能访问,句柄只是系统提供给你的一种内核对象的标志而已,而且跟进程相关。句柄D是还在A中,但那只是一个值而已,你可以通过各种手段(包括前面说的共享内存段)将这个值传给B就可以了,为什么不能调用
DuplicateHandle可以在任何进程中执行,你哪怕在第三个进程T中也可以执行的

请参考<<Windows核心编程>>
skyzxg 2005-12-09
  • 打赏
  • 举报
回复
Up
skyzxg 2005-12-09
  • 打赏
  • 举报
回复
UP
skyzxg 2005-12-08
  • 打赏
  • 举报
回复
Up
skyzxg 2005-12-08
  • 打赏
  • 举报
回复
可惜我早就试过了,共享可以得到值,但通讯不成功
xiaoqiqixiao 2005-12-08
  • 打赏
  • 举报
回复
都共享数据段了,当然可以直接调用,你试试不就知道了
skyzxg 2005-12-08
  • 打赏
  • 举报
回复
通过DuplicateHandle呢
hushuangyan74 2005-12-08
  • 打赏
  • 举报
回复
串口的资源是独享的,如果一个程序在使用串口,其他的程序就不能使用此串口了,必须等它用完了,才能使用!
skyzxg 2005-12-08
  • 打赏
  • 举报
回复
串口句柄通过#pragma data_seg共享数据段,第二次调用DLL可以直接调用吗

有一点要注意的是串口调用直接在DLL中完成,而不是例外挂了一层进行通讯
xiaoqiqixiao 2005-12-08
  • 打赏
  • 举报
回复
OpenComm()
{
AddRef();
}
CloseComm()
{
ReleaseRef();
}
AddRef()
{
if(m_nRef == 0){
//打开串口
}
m_nRef++;
}
ReleaseRef()
{
m_nRef--;
if(m_nRef == 0){
//关闭串口
}
}
Send(UCHAR* p, UINT nlen)
{
//发送数据
}
采用类似COM的结构,有一个要打开串口OpenComm,就AddRef一次人,有一个关闭CloseComm就ReleaseRef一次,发送数据就用Send了
注意这里的串口句柄和m_nRef这些变量要用DLL的#pragma data_seg共享数据段

至于从串口收到数据,发回给应用,我觉得用事件比较合适,如果需要的话,可以再探讨
skyzxg 2005-12-08
  • 打赏
  • 举报
回复
这个我知道,句柄C是A中得到
B想要获得C的复制,因此DuplicateHandle是在A中执行还是B中

我想是A中吧,如果这样,复制出来的句柄D不还是在A中吗?B如何调用D啊
xiaoqiqixiao 2005-12-08
  • 打赏
  • 举报
回复
A,B都可以啊,甚至A和B相同也没关系啊
设A中C的句柄为X,B中C的句柄为Y,就是
DuplicateHandle(A, X, B, &Y, ...);
skyzxg 2005-12-08
  • 打赏
  • 举报
回复
Up
skyzxg 2005-12-08
  • 打赏
  • 举报
回复
如果A有对内核对象C访问,希望B也能拥有对C的访问
hSourceProcessHandle是A
hTargetProcessHandle是B
hSourceHandle是C
是在A程序中使用DuplicateHandle吗

那B中如何获得C的访问呢
xiaoqiqixiao 2005-12-08
  • 打赏
  • 举报
回复
好象是哦,应该是要DuplicateHandle一下的
加载更多回复(1)

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧