Как мне объявить функцию в VBA, которая принимает аргументы типа XlfOper (LPXLOPER)?

Я узнал в ответе на предыдущий вопрос способ вызова функции, определенной в (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.

2

Решение

После некоторого исследования я нашел это: Передача пользовательских типов

MSDN написал: Многие функции DLL требуют передачи структуры данных с использованием предопределенного формата. При вызове функции DLL из VBA вы передаете определенный пользователем тип, который вы определили в соответствии с требованиями функции.

Итак, вам нужно определить структуру данных XlfOper;)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]