DLL如何与进程通信?

jedi00 2010-05-11 10:43:01
遇到这样一个问题:client进程需要调用一个DLL与server进程进行数据通信(需要发/收大的数组),我对windows系统编程所知不多,请教大家这种情况下应该怎么操作?使用内存共享的话,DLL如何通知server数据已经写到共享内存中了?同样对server,它又如何通知DLL数据已经写到共享内存中了呢?
...全文
247 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jedi00 2010-05-11
  • 打赏
  • 举报
回复
能详细说说吗?dll怎么导出“接口”,“主程序调用”又是什么意思?

[Quote=引用 11 楼 mcaok 的回复:]

dll导出一个接口,主程序调用也可以。最好是用Socket,方便。
[/Quote]
mcaok 2010-05-11
  • 打赏
  • 举报
回复
用Socket或管道在主程序和dll中分别开一个线程用来接收和发送数据就不用发自定义消息了。有数据到就会接收进来。
mcaok 2010-05-11
  • 打赏
  • 举报
回复
dll导出一个接口,主程序调用也可以。最好是用Socket,方便。
jedi00 2010-05-11
  • 打赏
  • 举报
回复
拜一个先。还是前面的问题,server进程怎么通知dll呢?也是一样处理吗?dll没有窗口句柄吧?

[Quote=引用 8 楼 mcaok 的回复:]

给你写个例子
DLL中
C/C++ code

#define WM_GETMESSAGE WM_USER+112 //自定义消息
HANDLE hMapping;
LPWSTR lpData;
hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x1000,"MYSHARE"); ……
[/Quote]
passion__ 2010-05-11
  • 打赏
  • 举报
回复
自定义消息,写到共享内存后,发自定义消息给另一个进程,另一进程收到后读就可以了。或者用SOCKET,内存映射文件,管道等进程通信方法。
mcaok 2010-05-11
  • 打赏
  • 举报
回复
给你写个例子
DLL中

#define WM_GETMESSAGE WM_USER+112 //自定义消息
HANDLE hMapping;
LPWSTR lpData;
hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x1000,"MYSHARE");
if(hMapping!=NULL)
{
lpData=(LPWSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData!=NULL)
{
swprintf(lpData,L"%s","你要写的数据");
//给主线程发送消息 g_hMain是目标进程的窗口句柄
PostMessage(g_hMain,WM_GETMESSAGE,NULL,NULL);

}
UnmapViewOfFile(lpData);
}
接收的进程
LRESULT CMainDlg::OnReceiveMessage(WPARAM wParam, LPARAM lParam)
{
HANDLE hMapping;
LPWSTR lpData;
hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x1000,"MYSHARE");
if(hMapping!=NULL)
{
lpData=(LPWSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData!=NULL)
{
CString strText(lpData);
//处理接收到的数据
.......
}
UnmapViewOfFile(lpData);
}
return true;
}

jedi00 2010-05-11
  • 打赏
  • 举报
回复
那server进程怎么通知dll呢?也是一样处理吗?


[Quote=引用 5 楼 mcaok 的回复:]

自定义消息,写到共享内存后,发自定义消息给另一个进程,另一进程收到后读就可以了。或者用SOCKET,内存映射文件,管道等进程通信方法。
[/Quote]
jedi00 2010-05-11
  • 打赏
  • 举报
回复
能再详细点说说吗?补充一下,现在client进程,dll和server进程都在本机,所以不需要进行IP通信

[Quote=引用 2 楼 sanguomi 的回复:]

DLL 封装通信的Client 模块就可以了
其他 IP,端口,等 当参数传进去
[/Quote]
mcaok 2010-05-11
  • 打赏
  • 举报
回复
自定义消息,写到共享内存后,发自定义消息给另一个进程,另一进程收到后读就可以了。或者用SOCKET,内存映射文件,管道等进程通信方法。
glorywu 2010-05-11
  • 打赏
  • 举报
回复
你采用共享内存,你的client和server在一台机器上吗?如果是的话,可以看作2个进程间的通讯啊,有很多办法啊,发消息吧。
jedi00 2010-05-11
  • 打赏
  • 举报
回复
因为client是已经编译好的软件,不能修改,只能通过DLL进行扩展。
sanguomi 2010-05-11
  • 打赏
  • 举报
回复
DLL 封装通信的Client 模块就可以了
其他 IP,端口,等 当参数传进去
jenf 2010-05-11
  • 打赏
  • 举报
回复
你client通知server就可以,为什么非得dll通知呢?

15,472

社区成员

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

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