Как вызвать функцию надстройки в одном XLL из другого XLL

0

Я создал пользовательскую функцию XLL+, sum1, и она может работать плавно в Excel после добавления этой надстройки. Но теперь я строю еще один XLL, скажем, sum2. Мне жаль, что я не могу назвать sum1 в этом добавлении в sum2. Поскольку 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();
}
  • 0
    Просто вызовите экспортированную функцию в вашем xll как если бы вы вызывали функцию dll (используя GetProcAddress и т. Д.). Я WinApi тэги dll и WinApi для вас, чтобы привлечь другие ответы.
Теги:
dll
winapi
visual-studio-2012
xll

1 ответ

0

Первым важным моментом является то, что XLL - это DLL.

Когда вы создаете XLL (DLL), Visual Studio также должна создавать файл LIB с тем же самым базовым именем (т.е. Если первый называется project1.XLL, тогда он также должен создавать project1.LIB).

Если вы добавите файл заголовка с соответствующим определением функции во второй проект, а также добавьте библиотеку, созданную с первым проектом, в свой второй проект, тогда VS должен позаботиться о грязных битах вызова GetProcAddress() и т.д.

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

Обратите внимание, что заголовок для второго проекта использует dllimport, а не dllexport.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню