- 博客(14)
- 收藏
- 关注
原创 Flutter 用 Image.asset 显示图片
虽然图片正常显示,但是我就想,如果我有100多张图片,每个图片名都加到 pubspec.yaml 里还不累死?
2025-07-23 18:00:24
318
原创 利用反汇编技术将游戏《烈火文明》修改为硬盘版
最近偶然得到一款叫《烈火文明》的游戏的 ISO 镜像文件,图1为游戏开始界面。这是一款1999年发行的游戏,主要运行平台是 Windows 98,只是没想到在 Windows 10 上还能运行,不过效果打了些折扣,这些不是重点,重点是它是那个年代典型的光盘版游戏,要将光盘插入光驱或用虚拟光驱才能运行,而我偏偏有将光盘版改成硬盘版的强迫症,所以才有了这篇文章。图1。
2025-07-21 12:10:50
662
原创 利用反汇编技术实现软件多开
客户的软件,用 C++/MFC 开发的,该软件只允许同时运行一个实例,运行第二个时提示不允许,如图1所示。图1因为没有源代码,所以只能用反汇编来修改。本文先讲解单开的实现原理,再讲解如何反汇编修改。
2025-07-13 17:07:30
967
原创 Windows C++ MFC 多字节与 Unicode
除了要将 char 改成 WCHAR,使用 char 的相关 API 也要改成 W 版本,而且要小心,有些 char 数组是做为缓存的,不是路径,不需要修改。但是使用这个选项的前提是代码里与路径相关的变量必须使用 TCHAR 数组、LPTSTR(本质是 TCHAR*)、LPCTSTR(本质是 const TCHAR*)才行,而客户代码里使用的全是 char 数组和 char*、const char*,所以改字符集是不行的(行的话也不会当一期项目发包过来)。在调用到 fopen_s 的时候程序就会报错退出。
2025-07-10 19:51:14
941
原创 C++ Windows API 系统托盘
/ 函数之前的 Win32 系统兼容时,才需要此函数及其用法。// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)// 将实例句柄存储在全局变量中。// 函数: InitInstance(HINSTANCE, int)// 在此函数中,我们在全局变量中保存实例句柄并。// TODO: 在此添加任意绘图代码...// WM_COMMAND - 处理应用程序菜单。// WM_PAINT - 绘制主窗口。// TODO: 在此放置代码。
2025-07-08 20:14:23
1053
原创 Android 集成 Unity3D 和 讯飞语音识别遇到的天坑
因为在主进程中是可以成功创建讯飞语音识别的,所以修改方案是,在 taxrobot 模块中增加 Application 类,在 Application 类中创建一个 Service,在 Service 中创建讯飞语音识别并提供相应的语音识别方法。思前想后,只有一个办法:双进程,就是将 主 Activity 在一个进程中(以下简称”主进程“),数字人 Activity在另一个进程中(以下简称”数字人进程”),这样在离开数字人 Activity 时,退出的是数字人进程,不会影响到主进程。// 停止语音识别消息。
2025-07-07 17:14:07
1440
原创 基于 CDialog 的 MFC 程序无法响应键盘消息
自己写一个继承了 CDialog 的类,然后响应 WM_KEYDOWN 消息,发现无论按什么键都不响应,需要重写 PreTranslateMessage 方法,在这个方法中处理 WM_KEYDOWN,至于原因,网上有很多解释,这里就不展开讨论。这里有一个更简单的方法。因为消息的传递是先从 CWinApp 再到 CDialog,所以可以重写 CWinApp 的 PreTranslateMessage,在这个方法里,将消息发给最前面的窗口就可以了,代码如下。然后对话框的 OnKeyDown 就能响应了。
2025-07-06 16:44:41
186
原创 androidx.appcompat:appcompat 的坑
在 1.6.1 及更低的版本中,Modifier.systemBarsPadding 是不包含 ActionBar 的,所以好友 BB 其实是被 ActionBar 遮盖住了,直到 1.7.1 才把 ActionBar 算作 systemBar。仔细检查了所有代码,又一顿调试,都没找出问题。后来无意间打开了工程文件夹下的 gradle/libs.versions.toml,发现里面提示 androidx.appcompat:appcompat 有比 1.6.1 更高的 1.7.1版,建议更新,如图3所示。
2025-07-05 16:20:39
618
原创 搭建 Windows 下的 Android Studio C++ 开发调试环境
公司有一套祖传的安卓代码,里面用到 C++,因为历史原因,每次 C++ 侧的改动都要在 ubuntu 虚拟机上编译打包,然后再复制到共享文件夹,再在 Windows 上复制到工程中运行,不仅麻烦,而且不能断点调试,所以我花了些时间把它改成可以在 Windows 上编译和调试。打开使用 本地方法的模块的 build.gradle(本实例是 app 下的 build.gradle),在文件中追加粗体字的内容。那么 app 模块中也要有相同的设置,否则打包后的 apk 中没有 so 文件,程序当然也会闪退。
2025-07-04 17:12:25
1283
原创 Android Compose Modifier 的 size 和 padding 方法的坑
找了半天,才发现问题出在"按住对话"按钮是先调用了 padding 后调用了 size,而"复制答案"按钮则相反。区别就在于,先调用 padding,这时尺寸还不确定,再调用size,尺寸确定了,也就是占用的空间确定了,就会在占用的空间周围设置 padding;如果反过来先调用 size,尺寸就定好了,再调用 padding,就会在 size 所占用的空间”削掉“一块空间作为 padding,如图3所示。text = "按住\n对话",// "按住对话"按钮。// "复制答案"按钮。
2025-07-03 15:57:09
918
原创 Android 在 build.gradle 里执行文件操作
into "../app/src/main/res/mipmap-hdpi/" // 目标位置。from "./src/main/_res/3d/ic_launcher.png" // 源文件。into "./src/main/assets/bin" // 目标文件夹。from "./src/main/_res/3d/bin" // 源文件夹。// 根据配置文件内容决定使用哪套 SDK。// 获取配置文件路径。两套第三方SDK分别放置在以下路径中。
2025-07-02 19:58:56
562
原创 android 动态申请写外部存储权限
从安卓11(Build.VERSION_CODES.R)开始,申请方式与之前版本有所不同,具体见下面注释。* @param grantResults 所有权限的申请结果。* @param permissions 所有申请的权限。TODO: 已经有权限了,继续执行业务代码。// 安卓10及以前版本。// 安卓11及以后版本。// 没有写外部存储权限则申请。// 安卓10及以前版本。// 安卓11及以后版本。// 判断用户是允许还是拒绝权限。TODO: 继续执行业务代码。// 判断是否已有权限。
2025-06-30 16:16:38
245
原创 利用反汇编技术将游戏《英雄无敌3》修改为硬盘版
kIwuL{<fomaokXvdbyhIEnb~”改成“.:\hEroEs3\daTa\HeROeS3.VId”(我去,还大小写混合,生怕别人搜到啊),然后用MOV [5E7D38],BL,BL值是字符C,这就变成“C:\hEroEs3\daTa\HeROeS3.VId”,之后CALL 005A12F1就是判断C:\hEroEs3\daTa\HeROeS3.VId是否存在。我就继续参考上面那篇文章,发现他后面的逻辑又和我的对不上了,应该是两游戏的版本不同。最后保存运行一下,直接进入了,大功告成!
2025-06-30 16:01:54
709
原创 将 MFC 类封装到 DLL 中
建议 Debug 模式使用 Use MFC in a Shared DLL + Debug Multithreaded DLL,Release 模式使用 Use MFC in a Shared DLL + Mulithreaded DLL。7.补充一点,如果 dll 不想使用 MFC,需要将 Use of MFC 设为 Use of Standard Libraries,并在要导出的类的头文件中,加入 #include <afxver_.h> 即可。
2025-06-30 15:53:41
686
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅