Question

J'ai une fonction particulière dans un Addin Excel (XLL). Le Addin est propriétaire et nous n'avons pas accès au code source. Cependant, nous devons appeler certaines fonctions contenues dans le Addin et nous aimerions appeler à partir d'un programme C #.

À l'heure actuelle, je pensais à écrire un interface C ++ appelant la fonction Excel avec xlopers, puis en appelant cette interface C ++ de C #.

Est-ce que quelqu'un qui a une expérience préalable de ce genre de questions savoir quelle serait la meilleure solution pour cela?

Anthony

Était-ce utile?

La solution

Vous devez créer un xlcall32.dll faux , le mettre dans le même répertoire que votre XLL (ne propre xlcall32.dll dans le PATH Excel ne put). Voici un code:

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

Supposons maintenant que j'ai un XLL appelé Xll-dll.xll avec une fonction appelée (utilisez « depends.exe » pour connaître les noms des fonctions exportées) xlAdd que bien ajoute deux doubles: extern "C" __declspec (dllexport) XLOPER * __cdecl xlAdd (XLOPER * pA, pB XLOPER *);

Le code suivant appelle:


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

Mon exe fonctionne réellement (à ma grande surprise), et la sortie 3 comme prévu. Vous devez avoir une certaine connaissance de ce que votre XLL attend effectivement des paramètres. Si elle alloue de la mémoire, vous devez vérifier si le #define xlbitDLLFree 0x4000 est fixé sur votre c- XLOPER> type et call back "xlAutoFree".

Autres conseils

Vous pouvez essayer XLL plus http://www.planatechsolutions.com/xllplus/ default.htm . Il est un peu cher, mais le  XLL Wrapper fonction bibliothèques est exactement ce que vous cherchez:

"Il est parfois utile de pouvoir appeler vos fonctions add-in Excel d'autres environnements, tels que les programmes de ligne de commande ou des applications interactives, écrites en C ++, Java, C # ou. Visual Basic La boîte à outils Xll Wrapper contient des outils , une bibliothèque d'exécution, des échantillons et de la documentation pour aider à l'élaboration de modules COM et des assemblages .NET qui enveloppent Excel XLL add-ins "

Un add-in Excel DLL peut être écrit en C #. Si oui, alors vous pouvez probablement contourner Excel tout à fait. Peut-être besoin d'une enveloppe bien.

vérifier si l'ensemble est disponible dans les fichiers de programme où vous installez le plguin, référence assemblage directement à votre projet C # - vérifier le navigateur d'objets pour votre classe, méthode ou objet

Vous devriez pouvoir utiliser la réflexion pour accéder à votre Addin. essayez d'utiliser réflecteur pour voir ce qui est disponible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top