【问题标题】:How do I call an add-in function in one XLL from another XLL如何从另一个 XLL 调用一个 XLL 中的加载项函数
【发布时间】:2013-12-17 13:54:43
【问题描述】:

我做了一个XLL+用户自定义函数sum1,添加这个插件后它可以在Excel中流畅运行。但现在我正在构建另一个 XLL,比如 sum2。我希望我可以在 sum2 中调用 sum1。由于 sum1 和 sum2 位于不同的 XLL 中,因此不能直接调用它们,需要一些代码来执行此操作。有没有人遇到过这个问题,有什么好的方法吗?

我搜索了这个问题并找到了下面的代码,这是由评估和 UDF 函数完成的。但似乎代码很旧,适用于 Visual Studio 2005,但不适用于 2012,运行时会出现 #Name 错误。

如果有人可以帮助我,我将不胜感激。非常感谢。

// Function:    CalDaysInYear2
// Purpose:     Calls a function in another XLL

//{{XLP_SRC(CalDaysInYear2)
    // NOTE - the FunctionWizard will add and remove mapping code here.
    //    DO NOT EDIT what you see in these blocks of generated code!
IMPLEMENT_XLLFN2(CalDaysInYear2, "RI", "CalDaysInYear2", 
    "DayCount", "Date & Time", "Calls a function in another XLL,"
    " which returns number of days in a year according to the"
    " day count", "Day count convention\000", "\0appscope=1\0",
    1)

extern "C" __declspec( dllexport )
LPXLOPER CalDaysInYear2(short DayCount)
{
    XLL_FIX_STATE;
    CXlOper xloResult;
//}}XLP_SRC

    static int xlfEvaluate = 257;
    static int xlUDF = 255;

    CXlOper xloName, xloRef;
    int rc = 0;
    xloName = "CalDaysInYear";`enter code here`
    if (!rc)
        rc = xloRef.Excel(xlfEvaluate, 1, &xloName);
    if (!rc)
        rc = xloResult.Excel(xlUDF, 2, &xloRef, &CXlOper(DayCount, 0));

    return xloResult.Ret();
}

【问题讨论】:

  • 只需在xll 中调用导出的函数,就像调用dll 函数一样(使用GetProcAddress 等)。我会添加dllWinApi 标签,以吸引其他答案。

标签: c++ winapi visual-studio-2012 dll xll


【解决方案1】:

首先要注意的是,XLL 是 DLL

当您构建 XLL(DLL) 时,Visual Studio 还应该创建一个具有相同基本名称的 LIB 文件(即,如果第一个文件名为 project1.XLL,那么它也应该创建 project1.LIB)。

如果您将具有适当函数定义的头文件添加到您的第二个项目,并将使用第一个项目创建的库添加到您的第二个项目,那么 VS 应该处理调用 GetProcAddress() 等的脏位。

extern "C" __declspec( dllimport ) 
LPXLOPER CalDaysInYear2(short DayCount);

注意,第二个项目的标头使用的是 dllimport 而不是 dllexport。

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2012-04-06
    相关资源
    最近更新 更多