尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C/C++工控二维码出入库系统实战:Win32+SQLite+sln部署指南
简介这是一套基于C/C开发的二维码扫码出入库管理系统完整源码工程面向计算机、自动化、电子信息等专业学生及初学者适用于毕业设计、课程设计或企业轻量级仓储管理场景。系统采用Visual Studio解决方案.sln组织含746个文件主体为9个C源文件.cpp、21个头文件.h、4个解决方案文件.sln及大量编译产物如239个dll、18个lib、19个pdb辅以配置文件.ini、资源文件.resx/.resources和图像素材.png/.jpg整体包体达267.08MB结构完整、可直接构建运行。已有285人学习下载所有功能模块均经实测验证可用。用户可获得可编译的VS工程框架、完整的二维码识别与数据库交互逻辑、标准化的出入库业务流程实现以及适配初学者理解的目录组织方式——核心代码与资源分离清晰便于调试修改与功能扩展。1. 这不是个“扫码增删改查”的玩具项目C/C写的二维码出入库系统为什么还在用.sln你打开一个叫二维码扫码出入库管理系统sln解决方案.zip的压缩包解压后看到.sln文件、一堆.cpp/.c、resource.h、stdafx.h甚至还有afxwin.h——第一反应可能是“这玩意儿怎么还没淘汰”但现实是产线工控机上跑着的物料登记终端、老旧仓库PDA嵌入式模块、国企设备台账系统后台服务至今大量依赖这种基于Visual Studio原生Win32 API 静态链接CRT的C/C方案。它不时髦但够稳没有Node.js的npm依赖爆炸没有Python的DLL地狱更不靠Java虚拟机兜底扫码逻辑直通USB HID模拟键盘输入或串口协议解析库存数据写进本地SQLite或内存映射文件整个流程在无网络、低配x86工控机4GB RAM Intel Celeron J1900上毫秒级响应。这不是教学Demo而是真实产线里“扫一下→弹窗确认→自动更新Excel台账打印小票”闭环落地的最小可行系统。适合懂Win32编程基础、能看懂资源脚本、愿意为稳定性放弃跨平台幻觉的工程师——尤其当你被要求“明天就部署到车间三台老电脑上不准装新运行库不准重启机器”时这个.sln就是你的救命稻草。2. 从.sln切入看清这个C/C项目的骨架与编译约束2.1 .sln不是“工程文件”而是VS生态的契约锚点.slnSolution File本质是纯文本记录了项目拓扑关系、配置映射和IDE行为策略。它本身不编译但决定了哪些.vcxproj被加载比如QRScanLib.vcxproj提供扫码核心InventoryMgr.vcxproj负责业务逻辑每个项目在 Debug/Release 下链接哪个CRT版本关键见后文避坑章是否启用/MT静态链接CRT还是/MD动态链接——这直接决定你部署时要不要拷msvcp140.dll提示用记事本打开.sln搜索ProjectSection(SolutionConfigurationPlatforms)可看到所有配置组合如Debug|Win32,Release|x64搜索Project({...}) 能定位每个子项目路径。别急着用VS双击打开——先确认你本机安装的VC Redist版本是否匹配。2.2 核心模块拆解扫码、解析、入库、持久化四层硬编码该项目典型分层如下按源码目录结构反推模块名关键文件技术要点为什么必须用C/C扫码驱动层usbhid_reader.cpp,qrcode_decode.c直接调用SetupDiEnumDeviceInterfaces()枚举HID设备用ReadFile()同步读取扫描枪原始字节流二维码解析用libqrencode的C接口非ZBar/Quagga等C封装USB底层IO需精确控制超时和缓冲区大小C的指针操作比C STL容器更可控避免异常传播破坏实时性业务逻辑层inventory_core.cpp,stock_op.h定义struct StockItem { char code[32]; int qty; time_t last_update; }所有增删改走纯函数式API如int stock_in(const char* qr, int delta)结构体内存布局严格对齐#pragma pack(1)便于直接序列化到文件或共享内存规避C虚表/RTTI开销UI交互层main_dlg.cpp,resource.rcMFC对话框为主CDialogEx派生按钮事件绑定ON_BN_CLICKED(IDC_BTN_SCAN, CMainDlg::OnBnClickedScan)二维码预览用CStaticStretchDIBits()渲染Win32 GDI绘图在低分辨率工业屏如800×600上比Qt/QML更轻量无GPU依赖持久化层db_sqlite.cpp,csv_export.cSQLite3 C APIsqlite3_open_v2(),sqlite3_bind_text()导出用fprintf()写CSV字段间用\t分隔兼容Excel中文乱码避免ORM抽象层SQL语句硬编码在.cpp中如INSERT INTO stock VALUES(?, ?, ?)执行前不校验参数类型——信任扫码结果格式2.3 编译链路为什么必须用VS2015–2022项目.vcxproj中PlatformToolsetv142/PlatformToolsetVS2019或v143VS2022表明其依赖MSVC最新ABI。关键约束CRT版本锁定若项目用/MT则编译产物自带CRT代码但stdafx.h中#include afxwin.h强制要求MFC库——这意味着你必须安装对应版本的Microsoft Visual C 2015–2022 Redistributable (x64)否则运行时报0xc000007b架构不匹配或MSVCP140.dll not found字符集陷阱CharacterSetUnicode/CharacterSet是默认值所有CString、AfxMessageBox()默认处理UTF-16但扫码返回的QR字符串常为UTF-8需显式调用MultiByteToWideChar(CP_UTF8, ...)转换否则中文显示为方块警告即错误TreatWarningAsErrortrue/TreatWarningAsError在Release配置中启用——C4244整型截断、C4996strcpy已弃用会直接中断编译必须用strcpy_s或strncpy替代!-- 示例vcxproj中关键配置片段 -- PropertyGroup Condition$(Configuration)|$(Platform)Release|Win32 PlatformToolsetv142/PlatformToolset CharacterSetUnicode/CharacterSet WholeProgramOptimizationtrue/WholeProgramOptimization RuntimeLibraryMultiThreaded/RuntimeLibrary !-- /MT -- TreatWarningAsErrortrue/TreatWarningAsError /PropertyGroup参数说明RuntimeLibraryMultiThreaded/RuntimeLibrary对应/MT生成可独立运行的EXE无需外部DLL若改为MultiThreadedDLL/MD则必须确保目标机器安装对应Redist——这是部署时最常翻车的点。3. 扫码功能实操从USB扫描枪到QR字符串的零拷贝路径3.1 硬件层对接绕过Windows HID类驱动直读原始数据多数扫码枪默认工作在“键盘模拟模式”HID Keyboard此时Windows将其识别为普通键盘扫码结果以WM_CHAR消息注入前台窗口。但该方案有致命缺陷焦点丢失时扫码失效、无法获取扫码时间戳、不能区分多台扫描枪。本项目采用更底层的HID Raw Device方式// usbhid_reader.cpp #include setupapi.h #include hidsdi.h HANDLE OpenScannerByVidPid(WORD vid, WORD pid) { GUID hidGuid; HDEVINFO hDevInfo; SP_DEVICE_INTERFACE_DATA devInterfaceData; HidD_GetHidGuid(hidGuid); hDevInfo SetupDiGetClassDevs(hidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); devInterfaceData.cbSize sizeof(SP_DEVICE_INTERFACE_DATA); for (DWORD i 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, hidGuid, i, devInterfaceData); i) { // 获取设备接口详情过滤VID/PID SP_DEVICE_INTERFACE_DETAIL_DATA* pDetail GetDeviceInterfaceDetail(hDevInfo, devInterfaceData); if (IsTargetDevice(pDetail, vid, pid)) { HANDLE hDev CreateFile(pDetail-DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDev ! INVALID_HANDLE_VALUE) { // 设置读取超时避免阻塞 COMMTIMEOUTS timeouts {0}; timeouts.ReadIntervalTimeout MAXDWORD; timeouts.ReadTotalTimeoutConstant 500; // 500ms超时 SetCommTimeouts(hDev, timeouts); return hDev; } } } return INVALID_HANDLE_VALUE; }逻辑说明SetupDiEnumDeviceInterfaces()枚举所有HID设备GetDeviceInterfaceDetail()获取设备路径如\\?\hid#vid_05e0pid_1200#...#{...}CreateFile()打开设备句柄。关键点在于不使用HidD_GetPreparsedData()——本项目直接读取原始报告描述符Report Descriptor字节流因为扫码枪厂商文档明确说明第3–18字节为ASCII码含回车无需解析HID Report ID。3.2 二维码解析libqrencode的C接口精简调用项目未用OpenCV太重或ZBarC封装复杂而是直接集成libqrencode的C版qrencode.h。注意不是生成QR而是解码扫描枪传入的原始字符串——此处存在概念混淆实际扫码枪已完成光学解码本层只需做字符串校验与标准化// qrcode_decode.c #include qrencode.h // 扫码枪返回示例SN:ABC123456789|LOT:20240301|QTY:10\r\n int ParseQRString(const char* raw, StockItem* item) { if (!raw || strlen(raw) 10) return -1; // 步骤1去除末尾\r\n扫码枪固件行为 char clean[256] {0}; strncpy(clean, raw, sizeof(clean)-1); size_t len strlen(clean); if (len 0 clean[len-1] \n) clean[len-1] \0; if (len 1 clean[len-2] \r) clean[len-2] \0; // 步骤2按|分割字段不用strtok_r——线程不安全 char* p clean; char* token; while ((token strsep(p, |)) ! NULL) { if (strncmp(token, SN:, 3) 0) { strncpy(item-code, token3, sizeof(item-code)-1); } else if (strncmp(token, QTY:, 4) 0) { item-qty atoi(token4); } } return (item-code[0] ! \0) ? 0 : -1; }参数说明strsep()是GNU扩展VS2015已支持sizeof(item-code)-1确保不溢出结构体atoi()不做错误检查——因扫码枪输出格式由产线统一规范信任输入合法性。若需强校验可替换为sscanf(token4, %d, item-qty)并检查返回值。3.3 实时反馈扫码成功后毫秒级UI响应MFC对话框中扫码线程通过PostMessage()向主线程发送自定义消息避免跨线程访问UI控件// main_dlg.cpp #define WM_QR_SCANNED (WM_USER 100) // 扫码线程回调 DWORD WINAPI ScanThreadProc(LPVOID lpParam) { HANDLE hScanner (HANDLE)lpParam; char buffer[256]; DWORD bytesRead; while (bRunning) { if (ReadFile(hScanner, buffer, sizeof(buffer)-1, bytesRead, NULL)) { buffer[bytesRead] \0; if (bytesRead 0) { // 解析成功后通知UI线程 PostMessage(g_hMainWnd, WM_QR_SCANNED, (WPARAM)buffer, 0); } } } return 0; } // 主窗口消息处理 LRESULT CMainDlg::OnQrScanned(WPARAM wParam, LPARAM lParam) { char* qrStr (char*)wParam; StockItem item {0}; if (ParseQRString(qrStr, item) 0) { // 更新UI闪烁绿色边框播放提示音 GetDlgItem(IDC_STATIC_PREVIEW)-SetWindowText(_T(✅ 扫码成功)); GetDlgItem(IDC_STATIC_PREVIEW)-Invalidate(); // 播放系统提示音无额外DLL依赖 Beep(800, 200); // 触发入库逻辑 stock_in(item.code, item.qty); } else { // 错误反馈 AfxMessageBox(_T(❌ 无效二维码格式), MB_ICONERROR); } return 0; }关键点PostMessage()是线程安全的Beep()函数无需引用任何库Windows内核直接支持Invalidate()强制重绘控件避免GDI残留。4. 入库与持久化SQLite嵌入式写入的防崩溃设计4.1 SQLite事务封装单条SQL不等于原子操作项目用SQLite而非文件直接写入因需支持并发查询如另一台PC远程查看库存。但直接执行INSERT INTO stock ...存在风险断电时可能损坏数据库文件。解决方案是强制事务WAL模式// db_sqlite.cpp #include sqlite3.h static sqlite3* g_dbHandle NULL; int InitDatabase(const char* dbPath) { int rc sqlite3_open_v2(dbPath, g_dbHandle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL); if (rc ! SQLITE_OK) return -1; // 启用WAL模式Write-Ahead Logging sqlite3_exec(g_dbHandle, PRAGMA journal_modeWAL;, NULL, NULL, NULL); // 设置同步级别平衡速度与安全性 sqlite3_exec(g_dbHandle, PRAGMA synchronousNORMAL;, NULL, NULL, NULL); // 创建表仅首次执行 const char* sql CREATE TABLE IF NOT EXISTS stock ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL, qty INTEGER DEFAULT 0, last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP );; sqlite3_exec(g_dbHandle, sql, NULL, NULL, NULL); return 0; } int StockIn(const char* code, int delta) { sqlite3_stmt* stmt NULL; const char* sql INSERT INTO stock (code, qty) VALUES (?, ?) ON CONFLICT(code) DO UPDATE SET qtyqtyexcluded.qty;; if (sqlite3_prepare_v2(g_dbHandle, sql, -1, stmt, NULL) ! SQLITE_OK) return -1; sqlite3_bind_text(stmt, 1, code, -1, SQLITE_STATIC); sqlite3_bind_int(stmt, 2, delta); int rc sqlite3_step(stmt); sqlite3_finalize(stmt); return (rc SQLITE_DONE) ? 0 : -1; }参数说明SQLITE_OPEN_FULLMUTEX启用完全互斥锁允许多线程安全访问PRAGMA journal_modeWAL将日志写入单独文件提升并发写入性能ON CONFLICT(code) DO UPDATE是SQLite 3.24语法避免先SELECT再INSERT的竞态条件——这是本项目能支撑产线高频扫码的核心设计。4.2 导出Excel兼容CSV用制表符替代逗号防字段含逗号产线要求导出CSV供Excel打开但物料描述常含逗号如电机,直流24V。若用逗号分隔Excel会错误切分字段。本项目采用Tab分隔并显式声明UTF-8 BOM// csv_export.c int ExportToCsv(const char* filename) { FILE* fp fopen(filename, wb); // 注意用wb而非wt避免Windows下\r\n自动转换 if (!fp) return -1; // 写入UTF-8 BOMEF BB BF unsigned char bom[3] {0xEF, 0xBB, 0xBF}; fwrite(bom, 1, 3, fp); // 写入表头Tab分隔 fprintf(fp, 编号\t物料编码\t数量\t最后更新时间\r\n); // 查询所有数据 sqlite3_stmt* stmt; sqlite3_prepare_v2(g_dbHandle, SELECT id, code, qty, last_update FROM stock ORDER BY last_update DESC;, -1, stmt, NULL); while (sqlite3_step(stmt) SQLITE_ROW) { int id sqlite3_column_int(stmt, 0); const char* code (const char*)sqlite3_column_text(stmt, 1); int qty sqlite3_column_int(stmt, 2); const char* time (const char*)sqlite3_column_text(stmt, 3); // Tab分隔字段内双引号转义Excel标准 fprintf(fp, %d\t\%s\\t%d\t%s\r\n, id, EscapeCsvField(code), qty, time); } sqlite3_finalize(stmt); fclose(fp); return 0; } // Excel要求字段含Tab、换行、双引号时需用双引号包裹且内部双引号变为两个 char* EscapeCsvField(const char* src) { static char buf[1024]; char* p buf; *p ; for (const char* s src; *s p buf sizeof(buf)-3; s) { if (*s || *s \t || *s \n) { *p ; *p *s; *p ; } else { *p *s; } } *p ; *p \0; return buf; }逻辑说明fopen(wb)避免文本模式下的\n→\r\n转换BOM确保Excel正确识别UTF-8EscapeCsvField()处理字段内特殊字符——这是产线验收时最常被挑刺的细节。5. 部署与避坑在无网工控机上一次跑通的血泪经验5.1 常见问题排查现象→原因→解决现象1程序启动报错0xc000007b原因32位EXE尝试加载64位DLL或反之常见于混用x86/x64编译配置。.sln中Platform设为Win32但某子项目设为x64。解决在VS中右键解决方案 → “配置管理器”确认所有项目Platform列统一为Win32或x64用dumpbin /headers your.exe查看machine字段14C为x868664为x64。现象2扫码后UI无响应但后台日志显示“解析成功”原因MFC消息循环被阻塞。常见于在OnQrScanned()中调用耗时操作如网络请求、大文件写入未移至工作线程。解决将stock_in()改为异步——用AfxBeginThread()启动后台线程执行数据库写入主线程只负责UI反馈。现象3导出CSV在Excel中中文显示为乱码原因未写入UTF-8 BOM或Windows记事本用ANSI打开后二次保存覆盖。解决确认ExportToCsv()中fwrite(bom, 1, 3, fp)执行成功用Notepad验证文件开头三字节为EF BB BF教育用户用Excel“数据→从文本/CSV”导入而非双击打开。现象4Release版运行正常Debug版报Access violation原因Debug版启用了迭代器调试Iterator Debuggingstd::vector等容器在越界访问时抛异常而Release版优化后该检查被移除。解决在Debug配置中关闭迭代器检查项目属性 → C/C → 代码生成 → “SDL检查”设为否或用/D _ITERATOR_DEBUG_LEVEL0强制禁用。现象5扫码枪偶尔重复触发同一码扫两次原因USB HID设备在Windows电源管理下进入休眠唤醒时重发上次报告。解决在OpenScannerByVidPid()后添加设备电源策略禁用DWORD powerState 0; DeviceIoControl(hDev, IOCTL_USB_HUB_SET_PORT_FEATURE, powerState, sizeof(powerState), NULL, 0, NULL, NULL);注意此操作需管理员权限建议在安装程序中静默执行而非运行时调用。6. 进阶技巧让这套C/C系统在现代开发流中活下去6.1 VS Code替代VS零配置C/C调试方案很多工程师不愿装VS20GB但又需要调试。用VS Code ms-vscode.cpptools插件可完美替代生成compile_commands.json在VS中右键项目 → “生成compile_commands.json”需先安装CMake Tools插件配置c_cpp_properties.json{ configurations: [ { name: Win32, includePath: [${workspaceFolder}/**, C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Include], defines: [_UNICODE, UNICODE, _CRT_SECURE_NO_WARNINGS], compilerPath: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe, cStandard: c11, cppStandard: c17, intelliSenseMode: windows-msvc-x64 } ] }launch.json断点调试{ version: 0.2.0, configurations: [ { name: (Windows) Launch, type: cppvsdbg, request: launch, program: ${workspaceFolder}/Release/InventoryMgr.exe, args: [], stopAtEntry: false, cwd: ${fileDirname}, environment: [], externalConsole: true } ] }关键点compilerPath必须指向你本机VS安装的实际路径externalConsole: true确保能看见printf()输出stopAtEntry设为false避免停在WinMain入口。6.2 单元测试注入用Google Test验证核心算法虽是Win32 GUI项目但业务逻辑层stock_op.h完全可测试。在InventoryMgr.vcxproj中新增测试项目// test_stock_op.cpp #include gtest/gtest.h #include stock_op.h TEST(StockOpTest, StockInIncrementsQty) { StockItem item {ABC123, 0, 0}; stock_in(ABC123, 5); // 此处需mock数据库实际用sqlite3_open(:memory:)创建内存DB EXPECT_EQ(GetStockQty(ABC123), 5); } TEST(StockOpTest, ParseQRHandlesEmptyFields) { StockItem item {0}; EXPECT_EQ(ParseQRString(SN:XYZ|QTY:, item), -1); // QTY为空 }落地提示测试项目必须与主项目共用RuntimeLibrary同为/MT否则链接时报LNK2038用sqlite3_open(:memory:)避免测试污染真实DB。6.3 自动化部署包一个bat脚本搞定所有依赖产线部署最怕“缺DLL”。用以下bat生成绿色部署包echo off setlocal set APP_NAMEInventoryMgr set BUILD_DIR.\Release set DEPLOY_DIR.\deploy mkdir %DEPLOY_DIR% copy %BUILD_DIR%\%APP_NAME%.exe %DEPLOY_DIR%\ copy %BUILD_DIR%\%APP_NAME%.pdb %DEPLOY_DIR%\ 2nul :: 复制必要DLL根据dumpbin /dependents结果 for %%i in (msvcp140.dll msvcr140.dll vcruntime140.dll) do ( copy C:\Windows\System32\%%i %DEPLOY_DIR%\ 2nul ) :: 检查SQLite DLL若用动态链接 if exist %BUILD_DIR%\sqlite3.dll ( copy %BUILD_DIR%\sqlite3.dll %DEPLOY_DIR%\ ) :: 生成部署清单 echo [%APP_NAME% Deployment Package] %DEPLOY_DIR%\README.txt echo Generated on %date% %time% %DEPLOY_DIR%\README.txt echo. %DEPLOY_DIR%\README.txt dir /b %DEPLOY_DIR% %DEPLOY_DIR%\README.txt echo Deployment package created in %DEPLOY_DIR% pause血泪经验dumpbin /dependents your.exe是唯一可信的DLL依赖清单来源不要凭经验猜测——曾因漏拷vcruntime140_1.dllVS2019特有导致客户现场崩溃。我干这行十年见过太多团队用Python/Java重写这类系统最后卡在工控机兼容性、USB权限、服务自启上返工。这套C/C方案不是过时而是把“稳定”二字刻进了每一行#pragma pack(1)和CreateFile()调用里。下次你面对一台贴着“Windows XP Embedded”标签的旧设备别急着骂娘——打开这个.sln把Release|Win32配置调好它比任何云原生方案都更接近产线的真实心跳。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

LDO电路笔试考点全解析:从拓扑结构到环路稳定性

LDO电路笔试考点全解析:从拓扑结构到环路稳定性

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

📅 2026/10/27 1:06:16
C# 抽象类与接口:相同点、区别与选用建议

C# 抽象类与接口:相同点、区别与选用建议

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

📅 2026/10/27 1:01:16
dblink的创建和使用

dblink的创建和使用

dblink(Database Link)数据库链接顾名思义就是数据库的链接 ,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink就可以像访问本…

📅 2026/10/27 1:01:16
MORE NEWS

更多资讯

📰

ZXing BitMatrix 位矩阵全解:一个 int 如何扛起 32 个像素的二维码生成底层逻辑

ZXing BitMatrix 位矩阵全解:一个 int 如何扛起 32 个像素的二维码生成底层逻辑 【免费下载链接】zxing ZXing ("Zebra Crossing") barcode scanning library for Java, Android 项目地址: https://gitcode.com/gh_mirrors/zx/zxing 你以为的二维码…

📰

React Native 鸿蒙实战:view-shot 视图截图在 HarmonyOS 上的接入与使用

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

📰

DSH Desktop 快速上手:一键安装桌面AI智能体客户端

DSH Desktop 快速上手:一键安装桌面AI智能体客户端 【免费下载链接】deepseek-harness-desktop 为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。 项目地址: https://gitcode.com/gh_mirrors/de…

📰

TVS与ESD保护器件选型详解:从零理解静电、浪涌、参数计算与接口保护

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

📰

离线会议纪要的硬件适配:没有独立显卡,也能本地生成纪要

离线会议纪要的硬件适配:没有独立显卡,也能本地生成纪要技术观察 阅读约 5 分钟本地化部署的语音转写工具,通常对硬件有一定门槛:显存不够,大模型跑不起来,会议纪要这种重负载任务更是如此。最近智转AI 预…

📰

全球DEM数据校验、格式选型与GIS地形分析实操

简介:面向GIS从业者与地理信息学习者的全球DEM地形数据获取文档,聚焦全球高程数据下载渠道分散、免费工具与学习资料难配套的问题。压缩包仅含1个docx文件,约12KB,篇幅精炼,集中整理全球范围DEM数据的百度网盘与天翼云…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬