C++实现远程桌面集群软件[通俗易懂]

C++实现远程桌面集群软件[通俗易懂]由于在学校需要管理很多主机的需要,自己动手写了个3389桌面集群的软件。软件很简单,分别用2种方式实现:(1)快速登入模式:微软的MsRdpClientActiveX控件实现(2)远程桌面模式:生成.rdp文件实现

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

由于在学校需要管理很多主机的需要,自己动手写了个3389桌面集群的软件。

C++实现远程桌面集群软件[通俗易懂]

软件很简单,分别用2种方式实现:

(1)快速登入模式: 微软的MsRdpClient ActiveX控件实现

(2)远程桌面模式:生成.rdp文件实现

                                                                                                                                                                                                 

看似很简单的过程,在实现的过程中也不是一帆风顺。不管再简单的东西,我们也要力争把它做的最好!

首先,我们分析一下需要的功能:

(1)读写主机信息的功能模块(这里我用最简单的ini)

(2)主机信息的加密解密(涉及密码之类的需要加密处理保存)

(3)主机状态在线离线检查

(4)生成rdp文件并实现登陆

(5)配置文件导入导出

                                                                                                                                                 

接着我来分享下遇到的问题

(1)使用MSTSCAX控件,断网导致使用控件的窗体卡死

MSTSCAX控件在一定程度上方便了我们在项目中处理远程桌面,如果不细读文档则会漏掉很多微软已经为我们封装好的功能。针对控件远程过程中断网导致的窗体卡死,我们只需要关闭rdp高级设置中的自动重连功能:m_MsRdpClientAdvancedSettings.put_EnableAutoReconnect(FALSE);

其他的很多远程桌面的属性都可以在CMsRdpClientAdvancedSettings6 ,CMsRdpClientSecuredSettings2中找到。

(2)服务器信息等内容,应该如何去存储和维护

读取配置文件,将配置文件保存在 std::map<SERVER, INFO> m_mapServerInfo 结构中,每一个SEVER对应唯一INFO,这里注意对<的重写(结构体作为map的key默认无法排序)

下面是我的SERVER和INFO结构:

typedef struct _SERVER_
{
	CString name;
	CString ip;
	CString port;
	CString user;
	//map中key为结构体时需要重写<
	bool operator <(const _SERVER_& other) const
	{
		if (ip < other.ip)
		{
			return true;
		}
		else if (ip == other.ip)
		{
			if (port < other.port)
			{
				return true;
			}
			else if (port == other.port)
			{
				if (user < other.user)
				{
					return true;
				}
				else if (user == other.user)
				{
					return false;
				}
			}
		}
		return false;
	}
}SERVER, *PSERVER;

typedef struct _INFO_
{
	CString password;
	CString note;
}INFO, *PINFO;

将服务器信息保存在
m_mapServerInfo中我们只需要直接对m_mapServerInfo增改删的操作,最后再写入配置文件就可以。写配置文件线程我们可以设定一个全局变量g_hWriteThread保证对配置文件的写入:

	if (g_hWriteThread != INVALID_HANDLE_VALUE)
	{
		if (WaitForSingleObject(g_hWriteThread, 200) == WAIT_TIMEOUT)
		{
			::TerminateThread(g_hWriteThread, 0);
			g_hWriteThread = INVALID_HANDLE_VALUE;
		}
	}
	CWinThread * thread = AfxBeginThread((AFX_THREADPROC)WriteThread, this);
	if (thread != NULL)
	{
		g_hWriteThread = thread->m_hThread;
	}

(3)程序写完,无法运行于windows 7

我的开发环境是8.1+VS2013,开发完成以后release版本放置于windows7的电脑无法正常运行,有MSTSCAX的窗体根本无法加载,在window7上跟踪dlg.DoModal()到occcont.cpp第925行 IsWindow(pTemp->m_hWnd) 引发了一个断言终止,往前分析看,原来是MSTSCAX并没有加载起,进入资源视图,真相大白:

C++实现远程桌面集群软件[通俗易懂]
于是我在WIN7上删除MSTSCAX并重新加入,搞定,Release版本在WIN7,WIN8.1完美运行。

(4)在win7生成的RDP文件无法正常运行

按照网上提供的rdp文件的格式,并运用API:CryptProtectData获得远程加密密码,导出rdp文件,在win8完美运行,在win7上并非正常运行,执行mstsc.exe以后未完成自动登陆,并未从已生成的rdp文件读取任何信息,如图:

C++实现远程桌面集群软件[通俗易懂]

我很好奇为什么在win8可以win7却不行,在用winhex查看rdp之后我发现我在rdp文件开头漏掉了FFEF,说明RDP是以Unicode编码存储的,这也说明,win8读取存储文件默认以Unicode编码来读取,win7在未找到FFEF时,不会以Unicode读取。编码,测试成功!

                                                                                                                                                 

总结:任何看似简单的问题都有值得学习和探索的地方,我不反对重复造轮子,但是一定要在造轮子过程中有自己的见解和收获,遇到问题格物致知,方能求得编程本质。


这个远程桌面集成软件大体写到这,如果你做相应功能遇到问题也可以回复交流讨论。




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181573.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 如何架设FTP服务器[通俗易懂]

    如何架设FTP服务器[通俗易懂]FTP服务器的架设在我们的实际网络生活中,特别是宽带网接入之后,FTP服务器作为文件的传输和共享工具得到广泛应用。FTP服务器在文件的传输上性能稳定,占用系统资源小,而且传输速度快,现在网上已经有很多的FTP服务器可供使用,而自己架设一个FTP服务器也很容易,下面介绍两种主流的FTP架构方式。1.利用微软公司的IIS微软的IIS功能非常强大,它除了提供WWW服务之外,还提供FTP的服务,利用…

  • 系统测试计划_软件系统测试计划

    系统测试计划_软件系统测试计划系统测试是针对软件产品系统进行的测试(黑盒测试) 功能测试:是否符合需求规格、功能设计、用户满意度 非功能测试:容错性、稳定性、异常处理能力、高强度输入处理能力、可用性、性能 系统测试(系统测试计划包含系统测试的设计、实现和执行的工作): 系统测试计划:完成系统测试计划。软件产品的需求规格确定后编写。 系统测试设计:完成系统方案。软件概要设计文档确定后编写。 系统测试实现…

  • Git配置账号信息

    Git配置账号信息在前面我们已经简单的说了一下Git是什么,用来干嘛什么,他与SVN的区别,以及它的安装。今天我们接着讲,当第一次下载后我们如何配置自己Git账号信息(这里可以是Github也可以是国内的码云账号等等),下面我们开始主题:这里大概有两种方式一种是通过全局配置信息让所有的项目都使用这个账号,另一种是在指定项目下配置单独的信息默认在我们第一次下载后Git后我们最好是配置到自己…

  • MongoDB(三)—-MongoDB的集合操作

    MongoDB(三)—-MongoDB的集合操作

    2020年11月12日
  • 跨数据库同步方案汇总怎么做_国内外数据库同步方案

    跨数据库同步方案汇总怎么做_国内外数据库同步方案Datax一般比较适合于全量数据同步,对全量数据同步效率很高(任务可以拆分,并发同步,所以效率高),对于增量数据同步支持的不太好(可以依靠时间戳+定时调度来实现,但是不能做到实时,延迟较大)。Canal、databus等由于是通过日志抓取的方式进行同步,所以对增量同步支持的比较好。OGG太贵一、早期关系型数据库之间的数据同步二、大数据时代下的数据同步三、总结一、早期关系型数据库之间的数据同步1)、全量同步比如从oracle数据库中同步一张表的数据到My

    2022年10月10日
  • 电脑硬件基础知识科普「建议收藏」

    电脑硬件基础知识科普「建议收藏」电脑的类型电脑可分为台式电脑、笔记本电脑、平板电脑(也有资料不将平板电脑算作电脑,但本博客暂时将它算作电脑),其中,台式电脑又可以分为一体式与分体式两种,一体式电脑即将主机、显示器及其他部件整合在一起的新式电脑、其亮点在于元件的高度集成,分体式电脑即为常见的台式电脑,由主机与显示器等部件组成。笔记本电脑(NoteBook)又称膝上电脑、手提电脑。平板电脑(又称TabletPC):一种小型且方便…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号