高分问一个DLL和进程通信的问题

william7_138 2017-09-05 05:30:58
最近小弟在做一个新的模块,具体是这样的,我们的软件需要用到第三方绘图软件中的图形数据,这里涉及到进程间通信的问题,目前确定使用截取WM_COPYDATA消息的方法作为进程间通信的纽带。初步的设计思路是新写一个DLL供我们软件调用,在DLL中建立一个隐藏的窗口,然后在这个窗口的消息循环中通过截取WM_COPYDATA来获取第三方绘图软件传来的数据。但是目前在DLL设计上遇到了一些问题,在纠结要不要写DllMain,要不要把DLL设计成SingleTon模式,还有就是如果在DLL中创建线程的话,在什么时候创建,什么时候销毁,还是让这个线程一直存在。我们自己的软件会在按下相应的功能按钮是使用这个DLL中的接口来获取第三方绘图软件中的图形数据。小弟刚开始写DLL,在设计DLL上的经验不是很多,欢迎大家来此帖讨论,不吝赐教,万分感谢。
...全文
925 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
william7_138 2017-09-19
  • 打赏
  • 举报
回复
非常感谢大家的回复,结帖给分了!
  • 打赏
  • 举报
回复
不就是为了交换数据吗?写临时文件。我强烈推荐。你没看微软的word打开的时候也创建临时文件 。这个放生可靠 。剪贴版有问题。这个电脑别人安装了软件。软件运行期间就不能使用拷贝了吗?要知剪贴板可是系统的。。 对方拷贝。你读取。电脑操作者还拷贝别的呢。实在不行。发消息。还有就是socket。建议udp。定义个duiy对应的端口。这都很简单了
  • 打赏
  • 举报
回复
费那个劲。写临时文件。你读取啊。临时文件不能交换吗?你这种方式也行。或者发送消息也行 。。
向立天 2017-09-06
  • 打赏
  • 举报
回复
按照你的描述 我觉得写dllmain函数 在里面直接创建线程 线程生命周期和dll一致
zgl7903 2017-09-06
  • 打赏
  • 举报
回复
一般截取消息/注入, DLL 是必须的, SetWindowsHookEx 的参数有说明 lpfn Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
jacksonfan 2017-09-05
  • 打赏
  • 举报
回复
可以在dll中建立消息队列 在主程序中向dll发送消息,dll获取到数据后再向主程序发送数据
homesos 2017-09-05
  • 打赏
  • 举报
回复
跨进程的通讯,推荐用SOCKET。 只加载一次到同一个进程里,DLL没必要做成单实例的,DLL加载、卸载会有相应的事件,在此处创建、停止线程,你创建个空的DLL项目,看一下里面自有的代码就明白了。
oyljerry 2017-09-05
  • 打赏
  • 举报
回复
如果DLL的话,那么最好是单例,这样只有一个出来消息,不会被干扰。你创建窗口,它自带消息循环,就不需要线程了,只不过你DLL中要把数据传递给别人用的时候,可以用线程等
赵4老师 2017-09-05
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
赵4老师 2017-09-05
  • 打赏
  • 举报
回复
smwhotjay 2017-09-05
  • 打赏
  • 举报
回复
进程通信 很多 进程间通讯 1.只要是创建内核对象,可以指定名称的.都可以跨进程..(有的可以利用通讯,有的只能做信号标记) CreateEvent CreateJobObject CreateSemaphore CreateWaitableTimer CreateFileMapping CreateMailslot CreateNamedPipe 2. Windows窗口消息 前提是两个进程都有窗口 SendMessage PostMessage 3. socket tcp udp 不精通socket的会遇到很多坑 4. 粘贴板 5. exe工程的共享段里的变量. 只能exe的多个实例间共享 6.共享内存 OpenFileMapping
	HANDLE hMap;  //读
	hMap= OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE, TRUE, "ysmw");
	if (hMap==NULL)
	{
		AfxMessageBox("OpenFileMapping 失败!"); return ;
	}
	LPVOID pVoid; 
	pVoid=::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0); 
	CString str=(char*)pVoid; 
	SetDlgItemText(IDC_EDIT1,str); 
	UnmapViewOfFile(pVoid);
	CloseHandle(hMap);
xiaohuh421 2017-09-05
  • 打赏
  • 举报
回复
进程间通知的方式还有很多. 你可以考虑一个TCP这类的. 线程的启动与销毁, 你完全可以在dll中提供出接口, 让调用者自己去控制.

15,471

社区成员

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

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