Я создаю XLL для Excel и пытаюсь зарегистрировать функции через XlfRegister.
Согласно документации Microsoft , вызываемая процедура (pxProcedure) может быть задана либо как строка (xltypeStr) для привязки к экспортируемому имени, либо как число (xltypeNum) для привязки к порядковый номер экспортируемой функции в XLL.
Кто-нибудь когда-нибудь заставлял это работать или это прослушивается?
Я пытаюсь сделать следующее:
XLOPER12 name;
Excel12(xlGetName, &name, 0); // return value check not shown here, but.. this call succeeds
auto args = new LPXLOPER12[10]();
args[0] = &name; // dll name as returnd by xlGetName
args[1] = TempNum12(1); // Exported ordinal of the XLL's function to invoke (1)
args[2] = MakeStr12(L"Q"); // type text
args[3] = MakeStr12(L"Test"); // name of the registered function in Excel
args[5] = MakeInt12(1); // register as macro
XLOPER12 regResultOper;
int xlResult = Excel12v(xlfRegister, ®ResultOper, 10, args);
// memory clean up ommitted as not relevant to question
xlResult возвращается с 0 (xlretSuccess), однако regResultOper имеет тип xltypeErr с .val.err = 15 (xlerrValue).
Если я использую ту же функцию, но использую
args[1] = TempStr12(L"invoke1"); // Exported ordinal of the XLL's function to invoke (1)
регистрация работает просто отлично.
Мой файл def находится ниже, и я подтвердил через dumpbin, что XLL экспортирует invoke1 с порядковым номером 1.
LIBRARY
EXPORTS
xlAutoOpen
xlAutoAdd
xlAutoRemove
xlAutoClose
invoke1 @1
Есть ли способ зарегистрировать функцию через ее порядковый номер (на практике я хочу избежать экспорта по имени полностью из-за размера файла XLL), или это просто ошибка?
В настоящее время я использую Excel 2010 для проверки этого.
Спасибо