题
我有在Excel插件(XLL)的特定功能。 该插件是专有的,我们没有访问源代码。然而我们需要调用包含在插件内的某些功能,我们想从C#程序调用它。
目前,想到写C ++接口调用带有xlopers Excel的功能,则调用此C ++接口从C#的。
有谁谁拥有这种问题的以往的经验知道什么是最好的解决办法?
安东尼
解决方案
你需要创建一个假xlcall32.dll 后,把它放在同一目录下XLL(不要把Excel的自己xlcall32.dll在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一个叫(使用“带的Depends.exe”找出的导出函数的名称)xlAdd功能以及添加了两个双打: 外部的 “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此外 http://www.planatechsolutions.com/xllplus/ Default.htm的。这是一个有点贵,但 XLL包装库功能正是你要找的:
“有时候,它能够从其他环境中,如命令行程序或交互式应用程序,用C语言编写打电话给你的Excel插件功能++,Java和C#或Visual Basic。该XLL包装工具包中包含的工具是有用的中,运行时库,示例和文档,以帮助的COM模块和.NET组件,其包裹的Excel XLL插件“的发展
这是Excel加载DLL可能被写在C#。如果是这样,那么你也许可以完全绕过Excel中。可能需要一个包装虽然。
检查装配是否是在你安装plguin程序文件可用, 参考该组件直接到C#项目 - 检查对象浏览器为你的类,方法或对象
您应该能够使用反射来访问您的插件。尝试使用的反射来看看有什么可用。