为Windows 7/64位创buildXLL Excel加载项(在Windows XP / 32上交叉编译)

我不是一个熟练的Windows程序员,但是我创build并维护了多年来32位Windows XP / Excel的XLL加载项。 我现在想创build一个Windows 7/64位版本,并遇到麻烦 – 我甚至不能让Generic.xll的例子工作。

这是我所做的最简单的版本 – 抱歉,这是漫长而迂腐的。

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

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

  • 开始菜单 – “打开Visual Studio x64交叉工具命令提示符(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开发人员资源\ Excel2013XLLSDK \ SAMPLES \ GENERIC \ x64 \ RELEASE \ GENERIC.xll复制到Windows 7/64计算机可访问的networking文件夹

在Windows 7/64计算机上:

  • 启动Excel 2013

  • 文件 – 选项 – 加载项 – pipe理Excel加载项 – 浏览,转到包含Generic.xll的networking文件夹,单击它。

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

  • 出现Generic.xll的function。

  • closures并重新打开Excel – 重新打开后,我收到一个消息框,指出“GENERIC.xll的文件格式和扩展名不匹配,文件可能损坏或不安全…”(如果我说“是”将其加载为文本文件,在电子表格的XLL中显示二进制代码。)

基于以前的(Windows XP / 32)XLL经验,这个消息几乎可以表示任何东西 – 包括缺less所需的DLL。 所以,

在Windows 7/64计算机上:

  • 安装Microsoft Visual C ++ 2010 x64可再发行组件 – 10.0.30319。 没有影响。

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

  • 运行“依赖Walker for Win64(x64)版本2.2.600,由Steve P. Miller开发”

  • 文件 – 打开 – Generic.xll

  • 它显示它找不到:
    – XLCALL32.DLL //从我的Windows XP工作经验XLL典型
    – 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 //从我的Windows XP工作经验XLL典型

所以,现在我被困住了。 我以为我有一个64位的问题,但我开始怀疑我是否有Windows 7的问题。

帮帮我?

谢谢,

蒂姆

听起来你知道这件事的一些事情。 XLCALL32和IESHIMS在依赖不是你的问题。

我的猜测是这是一个64位的问题。 我终于设法使用http://xll.codeplex.com获得64位版本。 也许你可以find一些你会发现有用的东西。

注意XLL加载过程。 当我们写代码被一个正常的进程加载的时候,并不是我们期望的简单的DLL加载。

如果你有一个完美的testing程序 – 但是你将工作代码添加到你的Excel加载项,并得到“这个文件可能被损坏或不安全”的消息…我build议你:

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

如果在初始化过程中,您的代码执行Excel不喜欢的调用,则将获得无意义的错误消息,并且您的加载项将作为文本文档重新加载。 不幸的是,我还没有完成关于Excel强加的细节的功课; 一般来说,我发现:

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

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

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

我真的希望我下次再犯这个错误的时候很快find这个页面!