我有一个特定的功能在Excel插件(xll)中。该插件是专有的,我们没有访问源代码的权限。然而,我们需要调用一些包含在插件中的函数,并希望从C#程序中调用它。
目前,我考虑编写一个C++接口,使用xlopers调用Excel函数,然后从C#调用这个C++接口。
有没有之前遇到过这种问题并且有最佳解决方案的人?
安东尼
我有一个特定的功能在Excel插件(xll)中。该插件是专有的,我们没有访问源代码的权限。然而,我们需要调用一些包含在插件中的函数,并希望从C#程序中调用它。
目前,我考虑编写一个C++接口,使用xlopers调用Excel函数,然后从C#调用这个C++接口。
有没有之前遇到过这种问题并且有最佳解决方案的人?
安东尼
# 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;}
# 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所需的参数有一定的了解。如果它分配了某些内存,您必须检查XLOPER c->type上是否设置了#define xlbitDLLFree 0x4000,并回调“xlAutoFree”。
Excell插件DLL可以用C#编写。如果是这样,那么您可能可以完全绕过Excel。不过可能需要一个包装器。
检查安装插件的程序文件中是否可用汇编,直接将该汇编引用到您的C#项目中-在对象浏览器中检查您的类、方法或对象