很明显问的问题是回调函数相关的,如果我写了一个服务模块,现有两个独立的进程将要同时调用这个模块,并且都是注册回调函数的方式进行链接,请问该用什么技术来实现这个服务模块。
注:本人之前是用dll的方式来写这个模块的,一个进程先启动dll的服务,另一个进程在调用这个dll时使用的是同一个服务,这时发现了问题,使用共享内存的方式注册了外部的函数指针,原来这个指针只在一个进程中识别,另一个进程的地址在这里是无效的,有没有人利用dll的方式实现过这种处理,或者有什么其他的方式来实现,像com之类的。
个人msn是 [email protected]欢迎加我讨论
谢谢
注:本人之前是用dll的方式来写这个模块的,一个进程先启动dll的服务,另一个进程在调用这个dll时使用的是同一个服务,这时发现了问题,使用共享内存的方式注册了外部的函数指针,原来这个指针只在一个进程中识别,另一个进程的地址在这里是无效的,有没有人利用dll的方式实现过这种处理,或者有什么其他的方式来实现,像com之类的。
个人msn是 [email protected]欢迎加我讨论
谢谢
解决方案 »
- TCP/IP通讯问题
- 进度条控件3问。。。。
- 有人用ListView吗?
- glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU上为什么取到的图像数据不对?
- 求vc6读写xml文件的例子
- 大家来帮翻译一段msdn上的关于OnInitDialog的返回值解释!要准确!
- 两个界面之间数据的互相调用
- 在线等待,答完结贴.用NON MFC做DLL,在DLL中需要显示一个对话框,为什么显示不出来呢?
- !!!宏替换#define的问题,编译不通过。寻求帮助〉〉〉
- 我使用WIN98自带的 -- D盘的属性——压缩——创建新的驱动器,把硬盘给变大了!!!可是,当我上格式化C区后,完了......
- 这个函数怎么用???
- [求助]如何使用研华USB-4716采集卡,采用MFC实现外触发多通道数据采集。
谢谢你的回答
参考代码:
#pragma data_seg("flag_data")
int g_nSharedFlag = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:flag_data,RWS")
一个模块,两个进程,前面已经说过了,这个被调用的模块的数据段空间是进程独立的,所以你需要考虑的是如何允许多个进程挂接回调操作。
你的服务程序和被调用DLL的关系没有太明白,姑且按照我的理解说吧:
1.一个服务程序,一个DLL,多个进程
2.服务程序支持对多个共享事件(或其他方式)的触发操作
3.DLL被任意进程调用时,检查是否启动了服务,再打开预先定义的服务程序分配给和他通讯的事件
4.进程调用DLL,将回调函数指针地址通过DLL的接口函数传给这个DLL拷贝
5.完成整个流程,服务程序->任意一个DLL->任意一个进程注:一个服务程序,有几个进程,就有几个DLL的拷贝,就需要服务程序支持几个共享事件。
如果两个进程都调用了同一个Dll的导出的同一个注册函数。
Dll里面只要不把该回调保存在共享节里面,那么直接呼叫就可以了。
系统已经帮你安全的隔离了两个进程。
BOOL initSign = FALSE;
CBFunA FunA;
CBFunB FunB;
#pragma data_seg()
#pragma comment(linker,"/SECTION:flag_data,RWS")dll在第一次启动的时候将会开启一个网络链接的服务,也就这时候会生成一个服务的实例,这时把initSign 置为TRUE,以后不管外部的其他进程如何调用这个dll,都将会判断到这个initSign = TRUE,从而不会再次创建实例而是共享之前启动的那个实例,我的问题来了,这里的回调函数就是我跟其他不同进程进行交互的方式。假如A进程第一次加载dll并且注册了FunA,那没错,这个FunA函数可以正常的使用,B进程注册了FunB,那问题来了,这个注册的函数指针是B进程的内存空间的地址,在进程A中是没法直接使用的,因为dll启动的时候是由进程A启动的,从而调用FunB的时候会出现异常。
谢谢您的回答
无非就是利用端口类似与作为回调地址了,多简单。
然后触发B进程中的DLL的某个行为再来用B进程中的DLL调B进程的回调。
实现起来会比较绕一点。
在进程A的Context里执行 进程B里的函数, 这个可行性太小了吧就算你执行了,你也是在A的地址空间里执行的,数据不可能带回到B进程.你可以考虑下 把B进程的函数需要的参数,用消息发过去, 在B的地址空间里执行.
谢谢楼上各位的指点了