遇到一个DLL和应用程序间共享数据的问题

timepalette 2003-10-19 09:26:08
目前我用的是共享内存的方法,DLL是包含一个全局钩子,和一个共享数据段:
#pragma data_seg("Infopeek_hook_data")
HWND glhRecieveWnd = NULL;
HHOOK glhHookWndProc = NULL;
HINSTANCE glhInstance = NULL;
_declspec(dllexport) TCHAR glszTitle[256];//这个定义下面详述
#pragma data_seg()
在del文件中
SECTIONS
Infopeek_hook_data READ WRITE SHARED
程序调用DLL,程序创建一个FileMapping,在DLL的DLLMAIL中OpenFileMapping:
.......
new CDynLinkLibrary(InfopeekhookDLL);
glhInstance=hInstance;
glhFilemap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS,
FALSE, _T("Infopeek Map_file"));
if (glhFilemap != NULL)
{
glpMapAddress = ::MapViewOfFile(glhFilemap,
FILE_MAP_ALL_ACCESS,
0, 0, 0);
}
这样,全局DLL加载到所有进程的地址空间,所以所有的进程和我的应用程序之间都有共享的页.这样的确实现了我的要求.
但是后来我突然发现,为什么不直接使用段("Infopeek_hook_data")?它不就是天然的
共享段吗?所有进程都有这个共享的段,但是在我的进程中该怎么引用这个段呢???
所以我用在段中用了_declspec(dllexport) TCHAR glszTitle[256];
但是变量不同于函数,我还是用不了.
帮我啊!!!!!!!!!!!!!!!!!!!!
...全文
46 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
timepalette 2003-10-20
  • 打赏
  • 举报
回复
MilitaryMiniatures,我能不能这样用?
在DLL中添加一个导出函数,这样写:
extern "C"
_declspec(dllexpert) LPVOID GetDataAddress()
{
return (LPVOID)glszTitle;
}
MilitaryMiniatures 2003-10-19
  • 打赏
  • 举报
回复
1,共享数据段中的变量,好像需要初始化;
2,将glszTitle前面的_declspec(dllexport)去掉,而且,由于牵涉到不同进程之间的通信,建议将TCHAR修改为char或者wchar_t
3,在def文件中,加上glszTitle
4,在调用这个dll时,首先,LoadLibrary,然后调用GetProcAddress,将"glszTitle"作为参数,如果能成功返回一个值,不是NULL,将它类型强制转换为TCHAR*(应该是char*,或者wchar_t*)就可以了。
5,dll导出变量和导出函数的机理好像是一样的。
good luck !

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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