MFC规则DLL调用避坑指南:模块状态与导出函数实战
简介这份资源是一套面向MFC初学者与Windows桌面开发者的调用MFC规则DLL共享非静态完整示例工程重点解决规则DLL在对话框程序中的导出、加载与调用问题适合正在学习DLL编程、需要动手验证共享DLL机制的同学参考。压缩包共38个文件约149KB包含10个h头文件、7个cpp源文件以及rc资源脚本、def模块定义文件、vcxproj工程文件、sln解决方案和ReadMe说明文档等主程序与DLL两个工程结构完整便于直接编译调试。目前已有438人学习下载。代码中配有详细注释并附有调用MFC规则DLL(共享非静态)实例的说明文档读者可据此理解DLL导出函数、对话框资源在DLL中的使用方式以及工程配置要点快速掌握规则DLL的编写与调用流程少走弯路。1. 调用MFC规则DLL的实例为什么你的导出函数一调用就崩很多人第一次做 MFC 规则 DLL 的调用都会遇到一个很玄学的现象DLL 编译通过LoadLibrary 返回句柄也正常GetProcAddress 拿到的地址非空可函数一执行就弹出一堆断言或者干脆整个进程静默退出。更让人抓狂的是同样的代码在有的机器上跑得好好的换一台就翻车。这不是运气问题而是 MFC 规则 DLL 的调用约定、模块状态和资源句柄这三件事没对齐。所谓 MFC 规则 DLL指的是以共享 MFC 库方式链接、对外暴露标准 C 风格导出函数的一类动态库。它和扩展 DLL 最大的区别在于扩展 DLL 只能被 MFC 程序调用而规则 DLL 理论上可以被任何 Win32 程序调用包括纯 C 的控制台程序。这个“理论上”就是坑的来源——规则 DLL 内部依赖 MFC 的模块状态一旦调用方没有正确初始化MFC 内部的对象映射、资源查找、内存分配就会全部错位。这篇笔记面向的是需要在 C 工程里复用一套 MFC 界面逻辑或业务逻辑的开发者。你可能已经有一个能跑的 MFC 程序现在想把其中一部分抽成 DLL 给别的模块用或者你拿到一个别人给的规则 DLL需要在自己的工程里调起来。下面从工程配置讲到导出函数写法再到调用侧的初始化和排错尽量把每一步的参数和边界说清楚。2. 规则DLL的工程配置与导出函数写法从零建一个能跑的骨架2.1 共享MFC还是静态MFC这个选择决定了调用方的门槛在 Visual Studio 里新建 MFC DLL 工程时向导会问你 MFC 的使用方式共享 MFC 还是静态链接 MFC。这个选项直接决定了调用方的复杂度。共享 MFC 的意思是DLL 本身不包含 MFC 的代码运行时去加载系统或 VS 安装目录下的 MFC 运行库。好处是 DLL 体积小多个模块可以共用一份 MFC。坏处是调用方必须保证 MFC 运行库能被找到而且调用方如果也是 MFC 程序必须和 DLL 使用同一版本的 MFC否则模块状态会冲突。静态链接 MFC 则是把 MFC 的代码直接编进 DLLDLL 体积会大好几兆但调用方不需要关心 MFC 运行库。对于规则 DLL 来说如果你的调用方是纯 Win32 程序静态链接 MFC 往往更省事因为不用在调用方那边做 MFC 初始化。我一般的做法是如果调用方本身就是 MFC 程序用共享 MFC保持版本一致如果调用方是纯 C/C 或者不确定用静态链接 MFC把依赖收进 DLL 内部。这个选择在工程属性里对应“配置属性 → 常规 → 使用 MFC”这一项共享 MFC 选“在共享 DLL 中使用 MFC”静态链接选“在静态库中使用 MFC”。注意静态链接 MFC 的规则 DLL如果内部创建了 MFC 窗口或使用了 MFC 的全局状态仍然需要在导出函数入口做模块状态切换这一点后面会讲。2.2 导出函数的声明extern C 和 __stdcall 一个都不能少规则 DLL 的导出函数必须用 C 风格链接否则 C 的名称修饰会让 GetProcAddress 找不到符号。标准写法是 extern C 加上导出宏调用约定用 __stdcall 或 __cdecl 都可以但调用方必须和 DLL 保持一致。下面是一个典型的导出函数声明放在 DLL 工程的某个头文件里// RuleDllExport.h #pragma once #ifdef RULEDLL_EXPORTS #define RULEDLL_API __declspec(dllexport) #else #define RULEDLL_API __declspec(dllimport) #endif // 导出函数统一用 extern C 避免名称修饰 // 调用约定用 __stdcall调用方也要用 __stdcall extern C RULEDLL_API int __stdcall InitEngine(void* pParam); extern C RULEDLL_API int __stdcall ProcessData(const char* pInput, char* pOutput, int nOutLen); extern C RULEDLL_API void __stdcall ReleaseEngine();这里三个函数分别对应初始化、处理和释放。InitEngine 接收一个 void* 参数用来传入调用方的配置结构ProcessData 做实际的数据处理输入输出都用字符缓冲区ReleaseEngine 负责清理。参数说明上pParam 设计成 void* 是为了让 DLL 不依赖调用方的具体结构体定义调用方可以传自己的结构体指针DLL 内部按约定解析。pInput 和 pOutput 用 char* 而不是 CString是因为 CString 是 MFC 类型跨模块传递会有内存管理问题。nOutLen 是输出缓冲区长度防止 DLL 内部越界写。2.3 在DLL内部正确切换模块状态规则 DLL 内部如果要用 MFC 的类比如 CString、CFile、CWnd必须在导出函数入口做模块状态切换。共享 MFC 的规则 DLL 会有一个从 CWinApp 派生的全局对象这个对象在 DLL 加载时创建但调用方线程进入 DLL 时MFC 的模块状态可能还指向调用方。标准做法是在每个导出函数开头加 AFX_MANAGE_STATE 宏// RuleDll.cpp #include pch.h #include RuleDllExport.h #include afx.h // 共享 MFC 时DLL 会有一个 CWinApp 派生对象 class CRuleDllApp : public CWinApp { public: CRuleDllApp() {} }; CRuleDllApp theApp; extern C RULEDLL_API int __stdcall InitEngine(void* pParam) { // 切换到本 DLL 的模块状态保证资源句柄正确 AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 这里可以安全使用 MFC 类 CString strTemp; strTemp.Format(_T(InitEngine called, param%p), pParam); // 实际初始化逻辑 return 0; } extern C RULEDLL_API int __stdcall ProcessData(const char* pInput, char* pOutput, int nOutLen) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (pInput nullptr || pOutput nullptr || nOutLen 0) { return -1; } // 用 MFC 的 CString 做一次转换演示内部使用 MFC CString strInput(pInput); CString strResult; strResult.Format(_T(processed:%s), strInput); // 转回 char 输出注意长度控制 int nLen WideCharToMultiByte(CP_ACP, 0, strResult, -1, pOutput, nOutLen, nullptr, nullptr); if (nLen 0) { return -2; } return nLen; } extern C RULEDLL_API void __stdcall ReleaseEngine() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 清理逻辑 }AFX_MANAGE_STATE 的作用是把当前线程的 MFC 模块状态切换到这个 DLL 自己的状态函数返回时自动恢复。如果不加这个宏DLL 内部用 MFC 资源时会去调用方的模块里找找不到就断言失败。这是规则 DLL 调用崩溃最常见的原因之一。参数上AfxGetStaticModuleState() 返回的是 DLL 自己的模块状态指针这个函数在共享 MFC 和静态 MFC 下都可用。静态链接 MFC 时模块状态切换同样需要因为静态 MFC 也有自己的状态管理。3. 调用方怎么把规则DLL跑起来加载、取地址、调用三步3.1 显式加载和隐式加载的取舍调用规则 DLL 有两种方式隐式加载和显式加载。隐式加载是在调用方工程里链接 DLL 对应的导入库.lib然后在代码里直接声明 extern C 函数并调用。这种方式写起来简单但要求 DLL 在程序启动时就能被找到否则程序直接起不来。而且如果 DLL 缺失报错信息很不友好。显式加载是用 LoadLibrary 和 GetProcAddress 在运行时动态获取函数地址。这种方式灵活可以在 DLL 不存在时给用户提示也方便做插件式架构。缺点是代码稍微多一点函数指针类型要写对。对于规则 DLL 的调用我一般推荐显式加载因为规则 DLL 往往不是程序的核心依赖动态加载能让主程序更健壮。下面是一个完整的显式加载示例// Caller.cpp #include windows.h #include stdio.h // 定义函数指针类型必须和 DLL 的导出声明完全一致 typedef int(__stdcall* PFN_InitEngine)(void* pParam); typedef int(__stdcall* PFN_ProcessData)(const char* pInput, char* pOutput, int nOutLen); typedef void(__stdcall* PFN_ReleaseEngine)(); int main() { // 加载 DLL路径可以是相对或绝对 HMODULE hDll LoadLibraryA(RuleDll.dll); if (hDll nullptr) { printf(LoadLibrary failed, error%lu\n, GetLastError()); return -1; } // 逐个获取函数地址 PFN_InitEngine pfnInit (PFN_InitEngine)GetProcAddress(hDll, InitEngine); PFN_ProcessData pfnProcess (PFN_ProcessData)GetProcAddress(hDll, ProcessData); PFN_ReleaseEngine pfnRelease (PFN_ReleaseEngine)GetProcAddress(hDll, ReleaseEngine); if (pfnInit nullptr || pfnProcess nullptr || pfnRelease nullptr) { printf(GetProcAddress failed, error%lu\n, GetLastError()); FreeLibrary(hDll); return -1; } // 调用初始化 int nRet pfnInit(nullptr); if (nRet ! 0) { printf(InitEngine failed, ret%d\n, nRet); FreeLibrary(hDll); return -1; } // 调用处理函数 char szOutput[256] { 0 }; nRet pfnProcess(hello, szOutput, sizeof(szOutput)); if (nRet 0) { printf(ProcessData result: %s\n, szOutput); } // 释放 pfnRelease(); FreeLibrary(hDll); return 0; }这段代码的关键点有三个。第一函数指针类型必须和 DLL 导出声明完全一致包括调用约定 __stdcall 和参数列表。如果 DLL 用 __stdcall 而调用方写成 __cdecl栈会不平衡程序直接崩。第二GetProcAddress 的名字要和导出名完全匹配extern C 保证了名字不被修饰所以直接写 InitEngine 就行。第三LoadLibrary 失败时用 GetLastError 看错误码常见的是 126找不到模块和 193不是有效的 Win32 程序通常是位数不匹配。3.2 调用方是MFC程序时的额外初始化如果调用方本身也是 MFC 程序比如一个基于对话框的应用那么 MFC 框架已经帮你做了初始化直接 LoadLibrary 调用即可。但要注意 MFC 版本一致性问题如果调用方用 VS2019 的 MFCDLL 用 VS2017 的 MFC共享 MFC 模式下可能因为运行库版本不同导致模块状态冲突。这种情况下要么统一 VS 版本要么把 DLL 改成静态链接 MFC。静态链接 MFC 的 DLL 不依赖外部的 MFC 运行库调用方是什么版本都不影响。如果调用方是纯 Win32 程序而 DLL 是共享 MFC 的那么调用方在调用 DLL 之前最好确保 MFC 运行库能被加载。实际测试中只要 DLL 能找到 mfc140u.dll 之类的运行库纯 Win32 程序也能调用共享 MFC 的规则 DLL因为 AFX_MANAGE_STATE 会在 DLL 内部完成状态切换。但如果 DLL 内部创建了 MFC 窗口消息循环还是需要调用方提供这一点要提前想清楚。3.3 用Dependency Walker和dumpbin确认导出名在写调用代码之前先用工具确认 DLL 到底导出了什么名字。Visual Studio 自带的 dumpbin 就够用dumpbin /exports RuleDll.dll输出里会列出所有导出函数的名称和序号。如果看到的是 ?InitEngineYGHPAPAXZ 这种被修饰的名字说明 extern C 没生效或者导出宏用错了。正常情况下应该看到 InitEngine、ProcessData、ReleaseEngine 这样的干净名字。另一个常见问题是 DLL 位数和调用方不匹配。32 位程序加载 64 位 DLL 会返回 193 错误反过来也一样。用 dumpbin /headers 可以看 DLL 的机器类型dumpbin /headers RuleDll.dll | findstr machine输出里 x86 表示 32 位x64 表示 64 位。调用方和 DLL 必须一致。4. 避坑与排查规则DLL调用中最容易翻车的五个点4.1 现象调用导出函数时弹出 MFC 断言提示资源句柄无效原因DLL 内部使用了 MFC 资源比如对话框模板、字符串资源但没有在导出函数入口做模块状态切换。MFC 默认去当前线程的模块状态里找资源而当前线程的模块状态属于调用方调用方没有这些资源于是断言失败。解决在每个导出函数的第一行加 AFX_MANAGE_STATE(AfxGetStaticModuleState())。注意这个宏必须放在函数最开头在任何 MFC 对象创建之前。如果函数有多个返回分支宏只需要加一次它会在函数返回时自动恢复。4.2 现象GetProcAddress 返回 NULLGetLastError 是 127原因导出函数的名称和调用方写的字符串不匹配。常见情况是 DLL 用了 C 编译但没加 extern C导致名称被修饰或者 DLL 工程里用了 .def 文件改了导出名调用方不知道。解决先用 dumpbin /exports 看实际导出名然后调用方按实际名字写。如果希望导出名干净在 DLL 里用 extern C 加 __declspec(dllexport)或者用 .def 文件显式指定导出名。.def 文件的写法是在 EXPORTS 段下列出函数名可以同时指定序号。4.3 现象程序在调用 DLL 后崩溃崩溃点在 ntdll 或 mfc140u 里栈信息看不出所以然原因调用约定不匹配。DLL 导出函数用 __stdcall调用方函数指针写成 __cdecl或者反过来。__stdcall 由被调用方清理栈__cdecl 由调用方清理两者混用会导致栈指针错位函数返回时跳到非法地址。解决检查 DLL 头文件里的调用约定和调用方函数指针类型的调用约定是否一致。建议统一用 __stdcall因为 Win32 API 都是这个约定而且 .def 文件导出时可以加 序号修饰。如果 DLL 是第三方给的用 dumpbin /exports 看导出名后面有没有 数字有 数字的一般是 __stdcall。4.4 现象DLL 内部 new 出来的内存在调用方 delete 时崩溃原因跨模块内存管理问题。DLL 和调用方如果链接了不同的 C 运行库各自有独立的堆DLL 里 new 的内存拿到调用方 delete堆不匹配直接崩。解决规则 DLL 的接口设计要遵循“谁分配谁释放”原则。DLL 里分配的内存提供专门的释放函数或者调用方传入缓冲区DLL 只负责填充。上面的 ProcessData 就是后者输出缓冲区由调用方提供DLL 只写入不分配。如果必须返回字符串DLL 可以导出一个 FreeBuffer 函数调用方用完调它释放。4.5 现象DLL 加载成功但调用某个函数时提示找不到入口点或者程序直接退出原因DLL 依赖的其他 DLL 缺失。规则 DLL 可能依赖 MFC 运行库、CRT 运行库或者第三方库。如果这些依赖不在搜索路径里LoadLibrary 会失败错误码 126。但有时候 LoadLibrary 成功了调用某个函数时才触发延迟加载的依赖这时会直接抛异常。解决用 dumpbin /dependents 看 DLL 依赖了哪些模块确保这些模块在调用方的目录或系统路径里。共享 MFC 的 DLL 依赖 mfc140u.dll、msvcp140.dll 等这些通常在 VS 安装目录下发布时需要一起带上或者让用户安装 VC 运行库。静态链接 MFC 的 DLL 依赖少很多但体积大。5. 进阶技巧用模块状态封装和导出类工厂让规则DLL更耐用前面讲的都是函数级导出适合逻辑简单的场景。如果 DLL 内部要维护一套完整的 MFC 对象体系比如一个文档视图结构函数级导出会变得很臃肿。这时候可以用类工厂模式在 DLL 里导出一个创建接口返回纯虚基类指针调用方通过基类操作对象。具体做法是在 DLL 里定义一个纯虚接口类比如 IEngine声明 Init、Process、Release 三个纯虚函数。然后 DLL 内部实现一个 CEngineImpl 继承 IEngine。导出两个 C 函数CreateEngine 返回 IEngine*DestroyEngine 接收 IEngine* 并删除。调用方只需要拿到 IEngine 头文件不需要知道实现细节。// IEngine.h调用方和 DLL 共用 class IEngine { public: virtual int Init(void* pParam) 0; virtual int Process(const char* pInput, char* pOutput, int nOutLen) 0; virtual void Release() 0; }; // DLL 内部实现 class CEngineImpl : public IEngine { public: virtual int Init(void* pParam) override { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 实际初始化 return 0; } virtual int Process(const char* pInput, char* pOutput, int nOutLen) override { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 实际处理 return 0; } virtual void Release() override { AFX_MANAGE_STATE(AfxGetStaticModuleState()); delete this; } }; extern C __declspec(dllexport) IEngine* __stdcall CreateEngine() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return new CEngineImpl(); } extern C __declspec(dllexport) void __stdcall DestroyEngine(IEngine* pEngine) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (pEngine ! nullptr) { pEngine-Release(); } }这种写法的好处是接口清晰调用方不需要管理一堆函数指针而且 DLL 内部的对象生命周期完全由 DLL 控制。注意 Release 函数里用了 delete this这要求对象必须是 new 出来的而且调用方不能自己 delete。DestroyEngine 里再调一次 Release 是双重保险实际项目中选一种即可。验证方法上我习惯在调用方写一个最小的测试用例只做 CreateEngine、Init、Process、DestroyEngine 四步每一步打印返回值。如果四步都返回正常再接入实际业务逻辑。这样能把 DLL 本身的问题和业务逻辑的问题分开排查起来快很多。最后一个血泪经验规则 DLL 的调试符号一定要保留。发布时至少保留 pdb 文件否则线上崩溃只能看地址没法定位。VS 里可以设置生成 pdb 但不随程序发布出问题时用对应的 pdb 和 dump 文件分析。这个习惯在排查模块状态相关的崩溃时特别有用因为这类崩溃的栈往往很深没有符号根本看不懂。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

iniscan 输出格式完全指南:Console、JSON、XML 与 HTML 一键切换

iniscan 输出格式完全指南:Console、JSON、XML 与 HTML 一键切换

应用安全开发工具 【免费下载链接】iniscan A php.ini scanner for best security practices 项目地址: https://gitcode.com/gh_mirrors/in/iniscan 点击查看 免费下载 iniscan 是一款面向 php.ini 的免费安全扫描工具,它按最佳安全实践检查配置文件并…

2026/10/11 13:15:52 阅读更多 →
云南河流矢量数据清洗与拓扑修复实战指南

云南河流矢量数据清洗与拓扑修复实战指南

简介:本资源为2024年最新版云南省河流水系GIS矢量数据集,面向地理信息、城乡规划、水利研究及环境分析等领域的科研人员、高校师生与GIS工程师,可支撑流域分析、空间叠加、制图出图及水文建模等专业应用。压缩包共11个文件,含shp&…

2026/10/11 13:15:52 阅读更多 →
Django+Vue外卖点餐系统毕设指南:从建表到联调全流程

Django+Vue外卖点餐系统毕设指南:从建表到联调全流程

简介:一套基于Python Django与Vue.js开发的外卖点餐系统毕业设计项目,采用B/S架构,适合计算机相关专业学生作为毕业设计或课程设计参考。前端覆盖首页、菜品详情、订单中心、用户中心等核心用户场景;后台提供总览、订单管理、菜品…

2026/10/11 13:14:52 阅读更多 →

最新新闻

策略为王开源交易软件源代码:从策略模式到回测引擎的量化框架实战

策略为王开源交易软件源代码:从策略模式到回测引擎的量化框架实战

简介:这是一份从策略为王论坛通过SVN获取的开源交易软件源代码,面向对证券行情系统、客户端开发感兴趣的开发者与量化爱好者,可用于学习行情展示、K线绘制与实时走势图等核心功能的实现思路。压缩包共1299个文件,约10.54MB&#x…

2026/10/11 14:02:16 阅读更多 →
从功能测试到测试开发:核心指标、项目实战与AI测试

从功能测试到测试开发:核心指标、项目实战与AI测试

1. 岗位跃迁,看的从来不是年限而是核心指标我年初帮一个做了两年手工功能测试的朋友改简历,他写了满满三页项目经验,核心亮点只有两句话:"熟悉软件测试流程、掌握缺陷管理工具"。我跟他说,这两句面试官一天能…

2026/10/11 14:02:16 阅读更多 →
接口自动化测试从零到一:Java体系落地全攻略

接口自动化测试从零到一:Java体系落地全攻略

在测试圈摸爬滚打这几年,我最大的感受就是:接口自动化测试是性价比最高的测试投入,没有之一。UI自动化脆如玻璃,环境一换就碎给你看;而接口自动化稳定如老狗,只要后端服务还活着,用例就能跑。但…

2026/10/11 14:02:16 阅读更多 →
TensorFlow Lite图像分类Android实战:模型转换、量化与端侧推理

TensorFlow Lite图像分类Android实战:模型转换、量化与端侧推理

简介:这份资源是一个基于TensorFlow Lite在Android手机上实现图像分类的完整工程demo,面向具备一定Android开发基础、希望将深度学习模型部署到移动端的开发者与学习者。它解决的是模型从训练环境迁移到手机端推理的落地问题,涵盖Java代码、G…

2026/10/11 14:02:16 阅读更多 →
OpenCV双目立体标定与校正:从标定板到极线对齐的完整链路

OpenCV双目立体标定与校正:从标定板到极线对齐的完整链路

简介:这份资源面向计算机视觉初学者与从事双目立体视觉开发的工程师,聚焦相机标定与立体校正环节。它基于VS2013与OpenCV3.0,对左右相机采集的棋盘格标定图像进行立体标定与立体校正,输出可用于立体匹配和三维重建的校正参数与图像…

2026/10/11 14:02:16 阅读更多 →
基于SpringBoot+Vue的健身房会员管理系统:从需求到部署实战

基于SpringBoot+Vue的健身房会员管理系统:从需求到部署实战

做健身房管理系统这个项目之前,我其实已经帮朋友的小型健身工作室手工处理过会员台账,用Excel记会员卡片信息、课程消耗、到期时间,说实话每天都在跟“这卡到底哪天到期”“这节私教课用了没有”这类问题搏斗。后来有一个某健身房老板找到我&…

2026/10/11 14:01:16 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →