0%

用户注册和登录ActiveX控件

0x00 前言

起初和老师商讨了一下,打算从属性页入手,设计一个综合的包含登录注册框的完整的控件。后来发现属性页只能在开发的时候调出(网上找到了一些解决方法但是没有调试出),对windows程序设计也不太熟。后来还是采用了最初想到的调用控件提供的方法进行登录注册的方法,登录和注册模块分别提供 UserLogin 和 UserRegister 方法,相关登录注册信息作为参数。

0x01 需求

采用ActiveX控件编程技术,完成下面ActiveX控件。

1)完成一个用户注册ActiveX控件(用户名、密码、邮箱、生日、身份证、手机等相关新),其中用户名、密码、身份证、手机等相关数据类型验证)。并调用ActiveX控件进行功能演示。

2)完成一个用户登录的控件ActiveX控件,要求用户名,用户密码(用户密码设置为软键盘输入),验证码。并进行ActiveX控件调用演示,可以不使用数据库存储,例如文件存放用户名和密码,进行登录。

平台要求:采用 MFC ActiveX编写,界面可以其他编程语言

0x02 总体设计

2.1 登录模块设计

创建一个自定义方法 UserLogin ,将用户名,密码作为参数

登录模块相较于注册模块简单,函数流程如下

用户名格式检验使用正则表达式。使用 GetUser_Password 函数获取文件每一行对应的用户名密码,然后进行判断。具体可以参数注册模块设计。

2.2 注册模块设计

创建一个自定义方法 UserRegister ,将用户名,密码,邮箱等信息作为参数

函数大致流程如图

从MFC传递过来的信息为CString类型,注意类型转换

2.2.1 格式检验

regex 库,使用正则表达式的方式对用户信息进行格式校验,reg1 存储正则表达式,rerResult1 存储匹配到的字符串,bValid1 存储判断的结果,最后再判断匹配结果就可以了。验证邮箱,身份证号,手机也是同样的。、

2.2.2 判断是否已经注册

从文件中一行一行地读取,GetUser_Password 函数获取每一行对应的用户名和密码,然后通过 strcmp 函数比较两个字符串是否相等来判断是否已经注册。

GetUser_Password 函数实现如下,二阶指针便于传递参数。也是通过正则的方式匹配,rerResult.str(1) 获取第一个匹配到的子串,即用户名。rerResult.str(2) 获取第二个匹配到的子串,即密码。然后通过二阶指针的方式传递变量。

最后简单的 c 语言文件操作将注册信息写入到文件中

文件存储格式如下

2.3 MFC 应用程序设计

使用了标签控件Tab Control 来切换登录和注册窗口,具体使用方法可以参见附录。

添加 AxtiveX 控件并绑定变量,调用其他 MFC 控件获取用户输入,最后调用 AxtiveX 控件的 UserLogin 方法就可以了。

2.3.1 获取验证码

GetRand 函数随机生成一个 4 位字符串存储于变量 randcheckcode 中,之后调用 MFC 接口 GetDlgItem 获取 ID 号为 IDC_BUTTON3 的按钮句柄,再设置 caption 为验证码,以显示出来。

2.3.2 软键盘输入用户密码

考虑了调用系统软键盘的方式,但是测试了ShellExec 和 CreateProcess,都只能打开记事本,不能打开软键盘。

https://blog.csdn.net/flushhip/article/details/83008317

按这篇文章的说法是 32 位程序运行在 64 位环境下会重定向 SysWOW64 下,而这个目录下没有 osk.exe 所以调用失败,但是我尝试了文章的解决方法,也把 osk.exe 复制过去了,还是打不开。无奈只能自己手写一个软键盘。

以按钮 “q” 为例,维护了一个全局 CString 变量 password,点击按钮 “q” 时,向这个字符串添加字符 “q”, displaypassword 用于在页面上显示。有点投机取巧,而且这种方法很麻烦,每一个字符需对应一个按钮。

2.3.3 用户登录

首先判断验证码是否正确,然后将输入信息作为参数传递给 UserLogin 函数。这里需要注意第一行 UpdateData() 是必需的,他的作用是将用户在输入框输入内容同步到绑定的变量。

0x03 总结

C 和 C++ 一个难点在于类型的转换,好在网上都能找到比较方便简洁的转换方法。由于ActiveX 控件不能直接下断点调试,只能将代码提到MFC应用程序中调试,很费时间。

软键盘实现密码登录那里并不是最优解法,没有调用到系统自带或第三方的软键盘,很浪费资源。

参考链接

[1] UniCode下CString转char* 的方法 https://blog.csdn.net/neverup_/article/details/5664733

[2] 标签控件Tab Control http://www.jizhuomi.com/software/207.html

[3] MFC连接mysql登录注册 https://blog.csdn.net/qq_29503183/article/details/81257983

[4] 一个视图显示ActiveX控件的属性页https://www.xuebuyuan.com/846502.html?mobile=0

[5] regex 类的使用 https://blog.csdn.net/l357630798/article/details/78235307

[6] windwos调用系统软键盘 https://blog.csdn.net/flushhip/article/details/83008317