1. 当符号选择器突然"罢工":一个GISer的崩溃瞬间
那天早上我正赶着完成客户的地图项目,准备给水系图层换个漂亮的蓝色符号。像往常一样双击图层打开属性窗口,点击Symbol Selector准备挑选样式时,整个人瞬间僵住了——本该密密麻麻排列着各种符号的窗口竟然空空如也!我的第一反应是ArcGIS卡住了,重启软件后问题依旧。更诡异的是,连系统自带的ESRI默认符号库也集体"失踪"了。
这种情况我后来才知道,在ArcGIS 10.x版本中相当常见。特别是在Windows系统更新后,或者安装了某些办公软件时,两个关键组件DAO350.dll和dao360.dll会莫名其妙消失。这两个文件属于微软的Data Access Objects数据库引擎组件,ArcGIS用它来管理符号库的访问路径。就像图书馆的管理员突然请假,书明明在书架上却找不到一样。
2. 诊断问题:如何确认是DAO组件缺失
2.1 快速检查三步法
首先打开文件资源管理器,导航到C:\Program Files (x86)\Common Files\Microsoft Shared\DAO目录。如果这个文件夹根本不存在,那基本可以确定问题所在。如果文件夹存在,检查里面是否包含这两个关键文件:
- DAO350.dll(约1.2MB)
- dao360.dll(约1.3MB)
我遇到过更隐蔽的情况:文件存在但损坏。这时可以右键查看文件属性,正常dll文件的数字签名应该显示"Microsoft Corporation"。如果显示"未知发布者"或者文件大小明显异常(比如只有几KB),就需要替换文件。
2.2 注册表验证法
对于喜欢刨根问底的技术控,可以进一步验证注册表项:
- 按Win+R输入
regedit打开注册表编辑器 - 导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\DAO - 正常情况应该能看到
3.5和3.6两个子项
有次帮同事排查时发现,他的注册表里DAO项整个消失了。这种情况往往发生在安装了某些"精简版"办公软件后,它们会自作主张地移除被认为"不必要"的组件。
3. 获取正版组件的三种安全途径
3.1 官方渠道获取
最稳妥的方式是从微软官方下载MDAC(Microsoft Data Access Components)安装包。虽然微软已经停止单独提供下载,但可以通过以下方式获取:
- 下载完整版Office安装镜像
- 用7-Zip等工具解压后,在
\wcu\DAO目录中找到这两个dll文件
我电脑里常年备着一个名为"GIS急救包"的U盘,里面就存着这些关键组件。建议每个GIS团队都建立这样的应急资源库。
3.2 从正常运行的电脑拷贝
如果办公室有其他同事的电脑能正常使用ArcGIS符号库:
- 让他们打开上述DAO目录
- 将两个dll文件复制到U盘
- 注意要连同文件夹结构一起复制(即保持\Microsoft Shared\DAO的路径)
去年我们单位集体中招时,就是用这个方法半小时内恢复了所有工作站的符号库。记得让提供文件的同事先关闭所有Office程序,否则dll文件可能被占用无法复制。
3.3 第三方下载的风险控制
虽然网上能搜到各种dll下载站,但我强烈建议不要轻易尝试。有次学员下载的"DAO360.dll"实际是伪装成dll的挖矿病毒。如果必须下载:
- 只选择知名技术论坛的附件
- 下载后先用Virustotal扫描
- 核对文件大小和数字签名
4. 完整修复流程:从文件部署到系统注册
4.1 文件部署的正确姿势
首先以管理员身份运行命令提示符(这点很重要!),然后执行:
mkdir "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO" copy DAO350.dll "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO" copy dao360.dll "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO"遇到过有用户反映复制失败,通常是权限问题。这时可以:
- 右键DAO文件夹→属性→安全→编辑
- 给当前用户添加"完全控制"权限
- 勾选"替换子容器和对象的所有者"
4.2 注册组件的关键细节
注册dll时最容易出错的是路径中的空格和引号。建议这样操作:
regsvr32 "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO\DAO350.dll" regsvr32 "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO\dao360.dll"如果看到"DllRegisterServer成功"的提示,就大功告成了。但有时会遇到错误0x80070005,这表示权限不足。解决方法:
- 以管理员身份运行cmd
- 先执行
cd /d "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO" - 再执行
regsvr32 DAO350.dll
5. 预防措施与进阶排查
5.1 建立组件备份机制
我现在的做法是:
- 将完好的DAO文件夹整体压缩备份
- 编写自动恢复脚本:
@echo off takeown /f "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO" /r /d y icacls "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO" /grant administrators:F /t xcopy /y /e "%~dp0DAO" "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO" regsvr32 "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO\DAO350.dll" regsvr32 "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO\dao360.dll"5.2 当常规方法失效时
有次遇到所有步骤都正确执行,但符号库依然空白。最终发现是Windows的DEP(数据执行保护)在作祟。解决方法:
- 打开系统属性→高级→性能设置
- 切换到"数据执行保护"选项卡
- 为ArcGIS主程序添加例外
还有一种罕见情况是符号库路径被篡改。可以检查注册表项:HKEY_CURRENT_USER\Software\ESRI\ArcMap\Settings看看"StyleDir"的值是否为正常路径。