Как мне объявить функцию в 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.

1 ответ

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

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

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

Другие вопросы по тегам