4

我不是熟练的 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 PLATFORM=x64 // 我认为这是预设的

  • cd C:\2013 Office System 开发者资源\Excel2013XLLSDK\SAMPLES\FRAMEWRK

  • nmake //没有错误

  • cd C:\2013 Office System 开发人员资源\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。没有影响。

  • 运行“由 Steve P. Miller 开发的 Win64(x64) 版本 2.2.600 的 Dependency Walker”

  • 文件 - 打开 - 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 问题。

帮助?

谢谢,

蒂姆

4

2 回答 2

2

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

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

于 2013-05-01T00:38:41.130 回答
1

注意 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 - 所以如果你发现更好的东西,请更新这个页面。

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

于 2015-03-07T19:35:50.290 回答