Я узнал в ответе на предыдущий вопрос способ вызова функции, определенной в (C ++) xll, без ее регистрации. Ранее я использовал инфраструктуру регистрации, предоставляемую XLW, и использовал тип XlfOper для передачи аргументов между VBA и xll.
Функция c ++ выглядит так:
extern "C" {
LPXLOPER EXCEL_EXPORT a_function(XlfOper arg1, XlfOper arg2);
}
Следуя ответу на мое предыдущее решение, я прямо объявляю функцию, что-то вроде этого:
Declare Function an_exported_function Lib "MyDrive:\MyPath\myxll.xll"_
Alias "a_function" (arg1 As Object, arg2 As Object) as Object
Присоединяясь к процессу Excel, я вижу, что функция вызывается, но я получаю мусор или нулевые данные в аргументах. Я полагаю, это связано с тем, что я не сказал VBA, как преобразовать данные в правильный тип данных.
Как правильно вызвать аргумент XlfOper? Я думаю, что вызов LPXLOPER должен сделать эту работу, так как xlw заявляет следующее:
Важно не добавлять какие-либо элементы данных или виртуальные
функции к этому классу. Дизайн xlw опирается на тот факт, что класс
XlfOper имеет тот же размер, что и LPXLOPER / LPXLOPER12, это предположение позволяет
значения этих типов, полученные из Excel, будут интерпретироваться библиотекой
как экземпляры XlfOper.
После некоторого исследования я нашел это: Передача пользовательских типов
MSDN написал: Многие функции DLL требуют передачи структуры данных с использованием предопределенного формата. При вызове функции DLL из VBA вы передаете определенный пользователем тип, который вы определили в соответствии с требованиями функции.
Итак, вам нужно определить структуру данных XlfOper;)
Других решений пока нет …