【问题标题】:Creating XLL Excel add-in for Windows 7/64 bit (cross-compiling on Windows XP/32)为 Windows 7/64 位创建 XLL Excel 插件(在 Windows XP/32 上交叉编译)
【发布时间】:2013-04-21 12:58:03
【问题描述】:

我不是熟练的 Windows 程序员,但多年来我创建并维护了一个用于 32 位 Windows XP / Excel 的 XLL 插件。我现在想创建一个 Windows 7/64 位版本,但遇到了问题 - 我什至无法让 Generic.xll 示例工作。

这是我所做的最简单的版本 - 抱歉,这很长而且很迂腐。

在我安装了 Visual Studio 2010 Professional 的 Windows XP/32 机器上:

  • 下载并安装了 Microsoft Excel 2013 SDK。

  • 开始菜单 - “打开 Visual Studio x64 Cross Tools 命令提示符 (2010)”

  • SET TYPE=RELEASE

  • SET PLATFORM=x64 // 我认为这是预设的

  • cd C:\2013 Office System Developer Resources\Excel2013XLLSDK\SAMPLES\FRAMEWRK

  • nmake // 没有错误

  • cd C:\2013 Office System Developer Resources\Excel2013XLLSDK\SAMPLES\GENERIC

  • nmake // 没有错误

  • 将生成的 C:\2013 Office System Developer Resources\Excel2013XLLSDK\SAMPLES\GENERIC\​​x64\RELEASE\GENERIC.xll 复制到 Windows 7/64 计算机可访问的网络文件夹中

在 Windows 7/64 计算机上:

  • 启动 Excel 2013

  • 文件-选项-加载项-管理Excel加载项-浏览,进入包含Generic.xll的网络文件夹,点击。

  • 允许 Excel 将 Generic.xll 复制到标准文件夹。它静默加载,没有消息(包括没有消息说它加载了 Generic.xll)

  • Generic.xll 中未出现任何功能。

  • 关闭并重新打开 Excel - 重新打开时,我收到一个消息框,提示“'GENERIC.xll' 的文件格式和扩展名不匹配。文件可能已损坏或不安全...”(如果我说“是”,它像文本文件一样加载它,在电子表格的 XLL 中显示二进制代码。)

根据之前的 (Windows XP/32) XLL 经验,此消息几乎可以表示任何内容 - 包括缺少所需的 DLL。所以,

在 Windows 7/64 计算机上:

  • 安装 Microsoft Visual C++ 2010 x64 Redistributable - 10.0.30319。没有影响。

  • 安装 Microsoft Visual C++ 2012 Redistributable (x64) - 11.0.51106。没有影响。

  • 运行“Dependency Walker for Win64(x64) Version 2.2.600,由 Steve P. Miller 开发”

  • 文件 - 打开 - Generic.xll

  • 显示找不到:
    -- XLCALL32.DLL // 典型的来自我在工作 XLL 上的 Windows XP 经验
    -- API-MS-WIN-CORE-COM-L1-1-0.DLL
    -- API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
    -- API-MS-WIN-CORE-WINRT-L1-1-0.DLL
    -- API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
    -- API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
    -- API-MS-WIN-SHCORE-SCALING-L1-1-0.DLL
    -- DCOMP.DLL
    -- IESHIMS.DLL // 典型的来自我在工作 XLL 上的 Windows XP 经验

所以,现在我被难住了。我以为我遇到了 64 位问题,但我开始怀疑我是否遇到了 Windows 7 问题。

帮助?

谢谢,

提姆

【问题讨论】:

  • 您是否尝试使用 Dependency Walker 查看加载 XLL 的错误是什么?

标签: visual-studio excel windows-7 64-bit xll


【解决方案1】:

听起来您对此有所了解。依赖中的 XLCALL32 和 IESHIMS 不是您的问题。

我的猜测是这是一个 64 位的问题。我终于设法让 64 位版本与 http://xll.codeplex.com 一起工作。也许你可以在那里找到一些你会觉得有用的东西。

【讨论】:

【解决方案2】:

注意 XLL 加载过程。这不是我们在编写由正常进程加载的代码时所期望的简单 DLL 加载。

如果您有一个可以完美运行的测试程序 - 但是您将工作代码添加到您的 Excel 插件并收到“此文件可能已损坏或不安全”消息...我建议您:

  • 检查加载过程中 Excel 不允许调用的初始化代码。

如果在初始化期间,您的代码执行了 Excel 不喜欢的调用,您将收到无意义的错误消息,并且您的加载项将作为文本文档重新加载。不幸的是,我还没有完成有关 Excel 施加的限制的详细信息。不过,总的来说,我发现:

  • 可以通过延迟初始化非常简单地解决该问题。

到目前为止,我发现 AutoOpen 事件很方便(尽管可能有更好的方法 - 如果你找到了,请告诉我。)我已经成功地使用了以下概念来避免这个问题:

// within the AutoLoad event handler
static bool init_completed = false;
if ( init_completed == false )
{
   initialize_all();    
   init_completed = true;
}

这允许 Excel 成功加载 XLL。到调用 AutoLoad 事件时,Excel 似乎没有对代码施加任何限制 - 允许执行初始化代码。

同样,AutoLoad 事件可能不是最好的地方 - YMMV - 所以如果你发现更好的东西,请更新这个页面。

我真的希望下次我犯这个错误时能尽快找到这个页面!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2013-09-19
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多