给EXE文件添加一个按钮,并使用DLL文件来实现对应的功能

第一步使用Restorarot打开程序

根据需要添加一个按钮,设置该按钮的消息ID,注意不要和其他控件的ID一样,添加完后保存。

此时这个程序上已经多出了一个按钮,点击它也会发送消息,但是程序不会对该消息做任何处理,因为我么还没有把对应的功能添加进去。

第二步制作一个可以实现功能的DLL。

我使用的是vs2019,编程语言为c语言。打开vs2019,创建新项目,选择桌面向导,点击创建,应用程序类型选择动态链接库,选择空项目,点击确定。

我们需要创建两个文件,一个.cpp文件,一个.h文件。.cpp文件里面就写你要实现功能的函数,就像平常写程序时写的函数一样,只是没有main()函数,但是注意要把.h文件包含进来。.h文件里面写的是函数的导出声明,书写方式如下图所示:

 extern “C”是指以C语言的方式导出。后面的函数就是要导出的.cpp文件的里的函数,该函数如下图所示:

 这里我把函数折叠起来了,.cpp文件里函数的书写方式和平常函数的书写方式没有任何区别。

两个文件都写好后直接点击运行,但是会出现报错提示:

 不过并不用管,DLL文件已经生成了。找到项目的路径,在Debug文件夹里能看到DLL文件和LIB文件:

 将DLL文件复制出来,放到和与要添加功能得程序同一个目录下。

现在DLL文件已经做好,第三步就是将DLL文件添加到程序中。用LordPE的PE编辑器打开程序,点击目录:

点击输入表那一行三个点的按钮:

在上面的框框右键,点击add import:

 

添加dll以及函数:

 查看你添加进去的dll:

 记住这个ThunkRVA的值,这个是新增的导入表的FirstThunk的偏移地址。

现在dll已经添加进去了,但是还没有调用的语句。这个时候要使用od来编辑程序。用od打开程序。我们要找到程序处理按钮消息的地方,所以下一个窗口消息断点。用OD打开程序后运行程序。

点击这个w。

 如果没出现东西就右键刷新一下。

选择202 WM_LBUTTONUP,点击确定。

 然后在程序上点击一下按钮,此时程序会中断在某个地方:

 但是这个地方是系统函数,我们要让程序中断在程序自己处理消息的地方。键盘alt+ m,在代码段设置一个内存访问断点:

 再点击运行程序,此时程序才真正中断在了处理消息的地方:

 

 最后我们再添加调用代码。

首先要找到一个合适的地方,修改代码使得程序跳转到我们调用函数的地方,函数调用完后再跳回去,期间要注意维持堆栈平衡。

可以很容易辨认出消息判断的地方:

 像这种一个比较然后接一个跳转就类似于c语言里的if else。我的方法是在这个地方进行修改,把那行进行比较的代码直接改成一个无条件跳转,跳转到我们要实现功能的地方,在那里进行消息的判断。

首先找到一块空闲的地方,然后修改指令:

 在空闲地址处实现消息判断和函数调用:

 因为修改指令那个地方的消息判断被我们直接改成跳转了,所以这里我们得自己进行消息判断,如果消息符合就跳回去执行原来的函数,不符合就继续判断是不是我们增加的那个按钮的消息,如果是就往下执行,不是就跳回原来那个模块,消息判断不符合之后要跳转的地方,之后用pushad保存寄存器环境,然后函数参数入栈,调用函数。函数地址就是之前ThunkRVA的值加上程序基址,要注意加上段寄存器。因为我这个函数没有自己维持堆栈平衡,所以调用完后我又出了一次栈,然后用popad恢复寄存器环境,最后跳回原来的地方。

修改完右键,复制到可执行文件就大功告成了。

运行程序,程序可以稳定运行,且点击按钮可以实现功能。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MFC(Microsoft Foundation Class)是一种开发Windows桌面应用程序的框架,可以使用动态链接库(DLL)来实现中英文切换。 首先,我们需要创建一个DLL项目,并在其中添加资源文件,包括不同语言的字符串和对应的ID。比如,可以创建两个资源文件一个是英文字符串,另一个是中文字符串,分别命名为en-US.res和zh-CN.res。 然后,在MFC应用程序使用LoadLibrary函数加载DLL,并调用FindResource和LoadResource函数加载对应语言的资源。可以通过设置不同的语言标识符参数来选择加载不同的资源。例如,对于英文资源,可以使用以下代码: HMODULE hModule = LoadLibrary(_T("dll路径")); HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(IDR_ENGLISH), RT_RCDATA); HGLOBAL hMemory = LoadResource(hModule, hResource); LPVOID lpResource = LockResource(hMemory); CString strEnglish((const char*)lpResource); FreeLibrary(hModule); 对于中文资源,只需将IDR_ENGLISH更改为IDR_CHINESE即可。 最后,使用CString或其他方法将获取的字符串显示在MFC应用程序的界面上,即可实现中英文切换。 需要注意的是,为了方便切换语言,在MFC应用程序中还需提供切换语言的选项或设置,通过相应的逻辑代码来实现切换时重新加载DLL并更新界面显示的字符串。 总结起来,借助MFC的特性和DLL的加载能力,我们可以在应用程序中通过加载不同的资源文件实现中英文切换。 ### 回答2: 在MFC中使用DLL实现中英文切换,可以通过以下步骤进行: 第一步,创建一个DLL项目,用于存储中英文的字符串资源。可以在资源文件添加对应的中英文字符串,并在代码中定义一个函数来获取这些字符串。 第二步,创建一个MFC应用程序项目。在应用程序的初始化过程中,加载DLL文件并获取所需要的字符串资源。可以使用LoadLibrary函数加载DLL文件,并使用GetProcAddress函数获取相应函数的地址。 第三步,创建一个语言选择界面,用于让用户选择要使用的语言。可以使用对话框或者菜单添加语言选项。用户选择语言后,将相应的语言标识保存在配置文件或注册表中。 第四步,根据用户选择的语言标识,动态修改应用程序中的字符串显示。可以通过调用DLL中的函数来获取对应的中英文字符串,然后将其显示在对应的界面控件上。 第五步,在应用程序的所有界面中添加语言切换的功能。可以在每个界面的菜单栏或功能栏上添加一个语言切换的按钮或选项,用户点击按钮或选择选项后,重新加载相应语言的字符串资源,并刷新界面中的所有文本。 通过以上步骤,就可以实现MFC应用程序的中英文切换功能。用户可以根据自己的需要选择合适的语言,并在应用程序中动态更改界面文字的显示。这样可以提供更好的用户体验,同时方便应对不同语言环境下的需求。 ### 回答3: 在MFC中实现中英文切换可以通过使用动态链接库(DLL)的方式来实现。首先,我们可以在资源文件中创建多语言版本的字符串资源,分别对应中文和英文。然后,将这些字符串资源保存到一个DLL文件中。 在MFC应用程序中,我们需要在主窗口初始化时加载这个DLL文件,以便在运行时可以动态切换语言。可以在InitInstance函数中使用LoadLibrary函数加载DLL文件,并使用AfxSetResourceHandle函数将资源句柄设置为DLL文件的句柄。 当需要切换语言时,我们可以通过调用AfxSetResourceHandle函数来重新设置资源句柄为DLL文件的句柄,然后强制重绘界面。这样就可以实现界面上的文本、标签等显示为不同的语言了。 另外,为了方便管理和切换语言,可以根据需求在应用程序添加一个菜单或者工具栏,通过点击菜单项或者工具栏按钮在运行时切换语言。当用户通过菜单或者工具栏切换语言时,可以根据用户选择的语言,重新设置资源句柄为相应DLL文件的句柄,并强制重绘界面。 需要注意的是,在切换语言的过程中,我们需要注意重新加载语言资源,例如重新加载菜单资源、工具栏资源等,以便将其显示为对应的语言。 总的来说,通过使用DLL实现中英文切换可以让我们的应用程序更加灵活多语言化,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值