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

Visual studio 为Windows 7/64位创建XLL Excel加载项(在Windows XP/32上交叉编译),visual-studio,excel,windows-7,64-bit,xll,Visual Studio,Excel,Windows 7,64 Bit,Xll,我不是一个熟练的Windows程序员,但我为32位Windows XP/Excel创建并维护了一个XLL插件已经很多年了。我现在想创建一个Windows 7/64位版本,但遇到了问题-我甚至无法让Generic.xll示例工作 这是我所做过的最简单的版本——抱歉,这太长太迂腐了 在我安装了Visual Studio 2010 Professional的Windows XP/32计算机上: 下载并安装了Microsoft Excel 2013 SDK 开始菜单-“打开Visual Studio

我不是一个熟练的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交叉工具命令提示符(2010)”

  • 设置类型=释放

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

  • cd C:\2013办公系统开发人员资源\Excel2013XLSDK\SAMPLES\FRAMEWRK

  • nmake//没有错误

  • cd C:\2013办公系统开发人员资源\Excel2013xlsdk\SAMPLES\GENERIC

  • nmake//没有错误

  • 将生成的C:\2013 Office System Developer Resources\Excel2013xlsdk\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计算机上:

    < P>安装微软Visual C++ 2010 X64可重新分配-10。没有影响

    < P>安装微软Visual C++ 2012可重分发(X64)-110.51 106。没有影响

  • 运行“由Steve p.Miller开发的Win64(x64)版本2.2.600的依赖项Walker”

  • 文件-Open-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-SCALLING-L1-1-0.DLL
    --DCOMP.DLL
    --IESHIMS.DLL//典型的Windows XP XLL工作经验

所以,现在我被难倒了。我以为我有64位的问题,但我开始怀疑我是否有Windows7的问题

帮忙

谢谢


蒂姆

听起来你好像知道一些这方面的事情。XLCALL32和IESHIMS不属于您的问题


我猜这是一个64位的问题。我最终成功地使用64位构建。也许你可以在那里找到一些有用的东西。

注意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。在调用自动加载事件时,Excel似乎没有对代码施加任何限制-允许执行初始化代码

不过,自动加载事件可能不是最佳位置-YMMV-因此,如果您发现更好的内容,请更新此页面


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

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