Pregunta

Tengo una función particular en un complemento de Excel (XII). El complemento es propietaria y que no tiene acceso al código fuente. Sin embargo tenemos que llamar a algunas funciones contenidas en el complemento y nos gustaría llamarlo desde un programa en C #.

En la actualidad, estaba pensando en escribir una interfaz de C ++ llamar a la función de Excel con xlopers, a continuación, llamar a esta interfaz C ++ desde C #.

¿Alguien que tenga experiencia previa de este tipo de problemas de saber cuál sería la mejor solución para eso?

Anthony

¿Fue útil?

Solución

necesitan para crear un xlcall32.dll falsa , lo puso en el mismo directorio que el XLL (no puso propia xlcall32.dll de Excel en el PATH). Aquí hay un código:

# 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;}

Ahora supongamos que tengo un XLL llama xll-dll.xll con una función llamada (uso "depends.exe" para averiguar los nombres de las funciones exportadas) xlAdd que también añade dos dobles: extern "C" __declspec (dllexport) XLOPER * __cdecl xlAdd (XLOPER * pA, pB XLOPER *);

El siguiente código llama:


# 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();}

Mi exe realmente funciona (para mi propia sorpresa), y la salida 3 como se esperaba. Debe tener algún conocimiento de lo que su realidad XLL espera para los parámetros. Si se asigna una cierta memoria, debe comprobar si el 0x4000 #define xlbitDLLFree se fija en su XLOPER c-> tipo, y devolver la llamada "xlAutoFree".

Otros consejos

Se puede intentar XLL Plus http://www.planatechsolutions.com/xllplus/ default.htm . Es un poco caro, pero la  Envoltura función XLL Bibliotecas es exactamente lo que busca:

"A veces es útil poder llamar a sus funciones de complemento de Excel de otros entornos, como los programas de línea de comandos o aplicaciones interactivas, escritas en C ++, Java, C # o Visual Basic. El kit de herramientas XII Envoltura contiene herramientas , una biblioteca de tiempo de ejecución, muestras y documentación para ayudar con el desarrollo de módulos COM y NET que se envuelven Excel XLL complementos "

Un complemento de Excel DLL puede ser escrito en C #. Si es así, entonces es probable que puede pasar por alto por completo Excel. Puede ser que necesite un envoltorio sin embargo.

comprobar si el montaje está disponible en archivos de programa en los que instale el plguin, referencia que el montaje directamente a su proyecto de C # - comprobar el explorador de objetos para su clase, método o un objeto

Usted debe ser capaz de utilizar la reflexión para obtener acceso a su complemento. trate de usar el reflector para ver lo que está disponible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top