模型如下:.exe //用户UI
------------
.exe //中间层,判断一些状态信息
------------
.DLL //底层DLL中间层先获得DLL的句柄,然后进行一些状态判断,如果正常,启动上层UI。
现在的疑问是上层UI同样需要这个句柄,我是这么想的。在DLL中定义个返回DLL文件句柄的函数,中间层和上层UI都可以访问,只是时间上的差异。
中间层访问后,正常便启动上层UI,然后UI同样方法取得句柄,操作。小弟的疑问:不同的进程获得同一DLL文件的句柄,在内存中是怎么存储的,是否会造成一些想不到的结果(本人认为句柄是一个地址,所以应该不会出现什么问题吧,请指点)
还有我查阅了其他的方法,想给DLL开辟个共享区、不同进程通过消息传递信息。不知还有什么方法,它们实现起来的难易忘大侠多多指教!
------------
.exe //中间层,判断一些状态信息
------------
.DLL //底层DLL中间层先获得DLL的句柄,然后进行一些状态判断,如果正常,启动上层UI。
现在的疑问是上层UI同样需要这个句柄,我是这么想的。在DLL中定义个返回DLL文件句柄的函数,中间层和上层UI都可以访问,只是时间上的差异。
中间层访问后,正常便启动上层UI,然后UI同样方法取得句柄,操作。小弟的疑问:不同的进程获得同一DLL文件的句柄,在内存中是怎么存储的,是否会造成一些想不到的结果(本人认为句柄是一个地址,所以应该不会出现什么问题吧,请指点)
还有我查阅了其他的方法,想给DLL开辟个共享区、不同进程通过消息传递信息。不知还有什么方法,它们实现起来的难易忘大侠多多指教!
首先创建一个有名的数据区。这在Visual C++中是使用data_seg pragma宏。使用data_seg pragma宏必须注意数据的初始化:
#pragma data_seg("MYSEC")
char MySharedData[4096]={0};
#pragma data_seg()
然后在用户的DEF文件中为有名的数据区设定共享属性。
LIBRARY TEST
DATA READ WRITE
SECTIONS
.MYSEC READ WRITE SHARED这样每个附属于DLL的进程都将接受到属于自己的数据拷贝,一个进程的数据变化并不会反映到其他进程的数据中。在DEF文件中适当地输出数据。以下的DEF文件项说明了如何以常数变量的形式输出MySharedData。
EXPORTS
MySharedData CONSTANT
最后在应用程序(进程)按外部变量引用共享数据。
extern _export"C"{char * MySharedData[];}
进程中使用该变量应注意间接引用。
m_pStatic=(CEdit*)GetDlgItem(IDC_SHARED);
m_pStatic->GetLine(0,*MySharedData,80);
-------------
DLLexe1先loadlibrary,调用dll中的一个函数,这个函数处理后会返回一个句柄,这个句柄就存在dll的共享段中
然后exe2 loadlibrary,调用另一个函数,这个函数会返回这个句柄。结果是exe2可以得到这个句柄的值,这些都没有问题,错误是无法使用这个句柄做操作,exe2中需要这个句柄进行处理百思不解,高手指点
to qizi0wang() :
---------------------------------
你的回答就是我遇到的问题,不过怎么去传句柄呢????
高手指点
to qizi0wang() :
---------------------------------
以前用句柄只知道它是一个地址,完全没有想象是一个偏移量。而且我要得到的句柄不是dll的句柄,而是exe1调用dll的函数后返回的句柄,那么这个句柄是否与exe1有直接联系,它是否也是偏移量?
为什么句柄是偏移量呢?指点一二
那就很复杂了,如果com是你自己写的那就需要依赖com的实现了。
按理说不应该产生这样的需求的,我觉得还是软件设计的问题,除非你是在用你自己的软件集成很多其他的软件,如果可以改设计实现的话,最好改成进程内吧。否则你的com在另一进程内根本无意义就算获得了它的接口也是没有意义的啊!
不过既然遇到了这样的情况,我就像应该能够解决这个问题,有一个函数DuplicateHandle,不知大家是否听过?也不知它能不能处理好这个问题
我只想和大家讨论一下这种情况的解决方法,谢谢大家参与。而且handle为什么不能在不同进程中传递使用,上面有朋友也提到了,就是handle的生成与这个.exe的调用有直接关系,handle其实就是在这个.exe文件内存区的一个偏移量,它只在这个进程中有效。虽然有共享数据区可以在不同进程见传递值,但handle的值传递起来就没有什么作用,因为它只是一个偏移量,离开这个exe的环境就没有作用了