現象描述
C++ 開發的 Excel XLL 加載項在大多數機器安裝 VS2008 Runtime 後正常加載,但個別機器即使安裝 Runtime 或 VS 仍無法加載,虛擬機重裝 32 位系統也無效。
核心排查維度
1. 位數匹配(最常見原因)
- Excel 進程位數決定加載項位數:64 位 Excel 僅能加載 64 位 XLL,32 位 Excel 僅能加載 32 位 XLL
- 檢查方法:Excel → 文件 → 賬戶 → 關於 Excel → 查看「32 位」或「64 位」標識
- 編譯目標:VS 項目屬性 → Configuration Manager → Active solution platform 設置 x86/x64
2. 運行時依賴項完整性
- VS2008 MD 模式需 MSVCR90.dll 等 CRT 庫
- 使用 Dependency Walker (depends.exe) 分析 XLL 依賴,查找缺失 DLL
- 常見缺失:
MSVCR90.dll、MSVCP90.dll、ATL90.dll、MFC90.dll
- 解決:安裝對應版本 Visual C++ Redistributable
3. 側邊組件清單
- VS2008 使用 SxS 組件清單,需確保目標機
WinSxS 目錄有對應版本
- 清單嵌入:項目屬性 → Manifest Tool → Embed Manifest = Yes
- 或部署
Microsoft.VC90.CRT.manifest 及 DLL 到同目錄
4. Excel 安全設置
- 信任中心 → 加載項 → 取消勾選「要求應用程序加載項由受信任發布者簽名」
- 信任中心 → 受信任位置 → 添加 XLL 所在目錄
- 禁用「禁用所有應用程序加載項」
5. 註冊表與 COM 組件
- XLL 非 COM 組件,無需註冊,但若使用 COM 互操作需檢查註冊表
HKEY_CURRENT_USER\Software\Microsoft\Office\\Excel\Options 中 OPEN 鍵值
系統化排查步驟
- 確認目標機 Excel 位數(32/64 位)
- 重新編譯匹配位數的 XLL(x86/x64)
- 用 Dependency Walker 檢查依賴完整性
- 安裝對應 VC++ Redistributable(x86/x64 皆裝)
- 配置 Excel 信任中心設置
- 查看 Windows 事件查看器 → Application 日誌獲取詳細錯誤碼
調試技巧
// 在 XLL 啟動函數添加日誌
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
if (fdwReason == DLL_PROCESS_ATTACH) {
FILE* log = fopen("C:\\Temp\\xll_load.log", "a");
fprintf(log, "DLL loaded at %p\n", hinstDLL);
fclose(log);
}
return TRUE;
}