Вопрос

У меня есть определенная функция в надстройке Excel (xll).Надстройка является частной, и у нас нет доступа к исходному коду.Однако нам нужно вызвать некоторые функции, содержащиеся в надстройке, и мы хотели бы вызвать их из программы C#.

В настоящее время я подумывал о написании интерфейса C++, вызывающего функцию Excel с помощью xlopers, а затем вызывающего этот интерфейс C++ из C#.

Кто-нибудь, кто уже имел опыт решения подобных проблем, знает, какое решение будет лучшим?

Энтони

Это было полезно?

Решение

Вам необходимо создать поддельный xlcall32.dll, поместите его в тот же каталог, что и ваш XLL (не помещайте собственный xlcall32.dll Excel в PATH).Вот код:

# include <windows.h>

typedef void* LPXLOPER;

extern "C" void __declspec(dllexport) XLCallVer ( ) {}

extern "C" int __declspec(dllexport) Excel4 (int xlfn, LPXLOPER operRes, int count,... ) { return 0; }

extern "C" int __declspec(dllexport) Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER far opers[]) {return 0;}

Теперь предположим, что у меня есть XLL с именем xll-dll.xll с функцией (используйте «dependents.exe», чтобы узнать имена экспортируемых функций) xlAdd, которая добавляет два двойных значения:extern "C" __declspec(dllexport) XLOPER * __cdecl xlAdd(XLOPER* pA, XLOPER* pB);

Следующий код вызывает его:


# include <windows.h>
# include <iostream>

// your own header that defines XLOPERs
# include <parser/xll/xloper.hpp>

// pointer to function taking 2 XLOPERS
typedef XLOPER * (__cdecl *xl2args) (XLOPER* , XLOPER* ) ;

void test(){
/// get the XLL address
HINSTANCE h = LoadLibrary("xll-dll.xll");
if (h != NULL){
xl2args myfunc;
/// get my xll-dll.xll function address
myfunc = (xl2args) GetProcAddress(h, "xlAdd");
if (!myfunc) { // handle the error
FreeLibrary(h); }
else { /// build some XLOPERS, call the remote function
XLOPER a,b, *c;
a.xltype = 1; a.val.num = 1. ;
b.xltype = 1; b.val.num = 2. ;
c = (*myfunc)(&a,&b);
std::cout << " call of xll " << c->val.num << std::endl; }
FreeLibrary(h); }
}

int main()
{test();}

Мой exe действительно работает (к моему удивлению) и выводит 3, как и ожидалось.Вы должны иметь некоторое представление о том, что на самом деле XLL ожидает от параметров.Если он выделяет некоторую память, вы должны проверить, устанавливается ли #define xlbitdllfree 0x4000 на вашем xloper c-> тип и вызовет обратно «xlautofree».

Другие советы

Возможно, вы захотите попробовать XLL Plus http://www.planatechsolutions.com/xllplus/default.htm.Это немного дорого, но функция библиотек XLL - именно то, что вы ищете:

«Иногда бывает полезно иметь возможность вызывать функции надстройки Excel из других сред, например из программ командной строки или интерактивных приложений, написанных на C++, Java, C# или Visual Basic.Набор инструментов Xll Wrapper содержит инструменты, библиотеку времени выполнения, образцы и документацию, помогающие разрабатывать COM-модули и сборки .NET, которые обертывают надстройки Excel XLL».

Библиотека надстройки Excel может быть написана на C#.Если да, то вы, вероятно, можете вообще обойти Excel.Хотя, возможно, понадобится обертка.

Проверьте, доступна ли сборка в программных файлах, где вы устанавливаете Plguin, ссылка на сборку непосредственно в ваш проект C# - проверьте браузер объектов для вашего класса, метода или объекта

Вы должны иметь возможность использовать отражение, чтобы получить доступ к вашей надстройке.попробуйте использовать Отражатель чтобы посмотреть, что доступно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top